内部编译器错误-开关表达式中的模板化转换操作符

Internal compiler error - Templated conversion operator in switch expression

本文关键字:转换 操作符 错误 编译器 开关 表达式 内部      更新时间:2023-10-16

下面的代码会使Microsoft编译器崩溃:

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

我的问题:代码是正确的还是编译器应该给出适当的错误?向整型的明确转换是否可能?

编译器崩溃总是一个bug,这段代码不能在gccclang上编译,但两者都提供了一个错误而不会崩溃。对于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; }

clanggcc的结果不同。

参见switch语句条件中同时具有模板和非模板转换操作符的类,讨论gccclang是否正确。我对N3323的解释暗示clang在这一点上是正确的。

提交bug报告

我为这个ICE提交了一个bug报告,到目前为止没有回应。尽管这看起来像是一个奇怪的角落案例,但它确实会导致内部编译器错误,应该修复。