Сбой компилятора всегда является ошибкой, этот код не компилируется ни на 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
подразумевает, что clang верен в этом.
Отправленный отчет об ошибке
Я отправил отчет об ошибке для этого ICE, пока нет ответа. Несмотря на то, что это кажется странным, это вызывает внутреннюю ошибку компилятора, которую следует исправить.
person
Shafik Yaghmour
schedule
30.07.2014
fatal error C1001: An internal error has occurred in the compiler.
... блабла ... пожалуйста, сообщите в Microsoft (я сообщил об ошибке). В строке оператора преобразования. - person typ1232   schedule 31.07.2014operator T
на самом деле ничего не возвращает, так что это UB, даже если он скомпилирован. - person T.C.   schedule 31.07.2014operator T()
должен что-то вернуть. Во-вторых,switch
ждетint
. - person 101010   schedule 31.07.2014class Var
в оператореswitch
только в том случае, если его можно преобразовать в целочисленное значение. - person Thomas Matthews   schedule 31.07.2014switch
нужен целочисленный тип, тип перечисления или тип класса, для которого существует единственная неявная функция преобразования в целочисленный тип или тип перечисления (6.4.2/2). Если бы он хотел именноint
, он мог бы получить его сv.operator int()
. Ноv
можно преобразовать во что угодно, поэтому утверждение неоднозначно. - person Igor Tandetnik   schedule 31.07.2014int
короче :). Извините за непреднамеренное введение в заблуждение. - person 101010   schedule 31.07.2014switch(v)
красной волнистой линией, а всплывающее сообщение Ошибка: выражение должно иметь тип integer или enum. - person Rob K   schedule 31.07.2014