g++ 4.9.0 принимает следующий код:
enum E { foo };
struct C {
operator E() const { return foo; }
operator E() { return foo; }
};
int main() {
C c;
switch (c) {
case foo: break;
}
}
Но clang 3.4.1 отклоняет его со следующей диагностикой:
12 : error: multiple conversions from switch condition type 'C' to an integral or enumeration type
switch (c)
^ ~
5 : note: conversion to enumeration type 'E'
operator E() const { return foo; }
^
6 : note: conversion to enumeration type 'E'
operator E() { return foo; }
^
Какой из них правильный? Это ошибка clang, ошибка g++, ошибка libstdС++, стандартный дефект или другое? Я сделал что-то глупое?
В коде, вызвавшем этот вопрос, C
есть std::atomic<E>
, а std::atomic<T>::operator T
перегружается на cv-квалификаторах const
и const volatile
.
Оба компилятора принимают E e = c;
, поэтому он кажется чем-то особенным для оператора switch
.