内部编译器错误 - 切换表达式中的模板化转换运算符

typ*_*232 5 c++ templates switch-statement implicit-conversion

以下代码崩溃Microsoft编译器:

class Var
{
public:
    template <typename T>
    operator T () const
    { }
};

int main()
{
    Var v;
    switch (v)
    { }
}
Run Code Online (Sandbox Code Playgroud)

我的问题:代码是否正确或编译器是否应该给出适当的错误?是否可以明确地转换为整数类型?

Sha*_*our 8

编译器崩溃总是一个错误,这个代码不会编译gcc或者clang两者都提供错误而不会崩溃.对于clang错误是:

error: statement requires expression of integer type ('Var' invalid)
switch (v)
^       ~
Run Code Online (Sandbox Code Playgroud)

gcc 提供以下错误:

error: ambiguous default type conversion from 'Var'
 switch (v)
          ^
Run Code Online (Sandbox Code Playgroud)

另请注意,在值返回函数的末尾流出的是C++中未定义的行为.

更新

添加:

operator int () const
{ return 0; }
Run Code Online (Sandbox Code Playgroud)

到班级带来不同的结果clanggcc.

在switch语句的条件既模板和非模板转换运算符类的讨论是否gcc还是clang正确.我对N3323暗示铿锵的解释在这一点上是正确的.

提交错误报告

为此ICE提交了一份错误报告,到目前为止还没有回复.即使这看起来像一个奇怪的角落情况,它确实会导致内部编译器错误,应该修复.