Следующий код вызывает сбой компилятора Microsoft:
class Var
{
public:
template <typename T>
operator T () const
{ }
};
int main()
{
Var v;
switch (v)
{ }
}
Мой вопрос: правильный ли код или компилятор должен выдать соответствующую ошибку? Возможно ли однозначное преобразование в целочисленный тип?
Сбой компилятора всегда является ошибкой, этот код не компилируется ни gcc
или же clang
но оба выдают ошибку без сбоев. За clang
ошибка:
error: statement requires expression of integer type ('Var' invalid)
switch (v)
^ ~
gcc
предоставляет следующую ошибку:
error: ambiguous default type conversion from 'Var'
switch (v)
^
Также обратите внимание, что выпадение из конца функции, возвращающей значение, является неопределенным поведением в C ++.
Обновить
Добавление:
operator int () const
{ return 0; }
в классе приводит к различным результатам от clang
а также gcc
,
Увидеть Классы с шаблонными и не шаблонными операторами преобразования в условии оператора switch для обсуждения того, gcc
или же clang
верно. Моя интерпретация N3323
подразумевает лязг правильно на этом.
Поданный отчет об ошибке
я подал отчет об ошибке для этого ICE, до сих пор нет ответа. Даже если это выглядит как странный случай, это вызывает внутреннюю ошибку компилятора, которая должна быть исправлена.