内部编译器错误-开关表达式中的模板化转换操作符
Internal compiler error - Templated conversion operator in switch expression
下面的代码会使Microsoft编译器崩溃:
class Var
{
public:
template <typename T>
operator T () const
{ }
};
int main()
{
Var v;
switch (v)
{ }
}
我的问题:代码是正确的还是编译器应该给出适当的错误?向整型的明确转换是否可能?
编译器崩溃总是一个bug,这段代码不能在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在这一点上是正确的。
提交bug报告
我为这个ICE提交了一个bug报告,到目前为止没有回应。尽管这看起来像是一个奇怪的角落案例,但它确实会导致内部编译器错误,应该修复。
相关文章:
- 我可以将C 17 Capture lambda ConstexPR转换操作符的结果用作函数指针模板非类型参数吗?
- Clang vs GCC vs MSVC模板转换操作符-哪个编译器是正确的
- 模板类型转换操作符=
- 链接隐式转换操作符
- 强制转换操作符函数在g++中可以很好地编译,但在其他编译器中不行.为什么
- 当目标类有多个构造函数时,消除强制转换操作符的歧义
- 删除转换操作符
- 强制转换操作符重载和引用
- 实现没有临时的转换操作符
- 不同的强制转换操作符被不同的编译器调用
- 为什么模板化的用户定义转换操作符能够确定其返回类型?
- const转换操作符
- 调用转换操作符不能用于静态const变量
- 内部编译器错误-开关表达式中的模板化转换操作符
- 强制转换操作符可以是显式的吗?
- 不同的编译器使用不同的强制转换操作符
- 是否需要重载类的强制转换操作符?
- 类型转换操作符重载——Visual studio 2013内部错误
- ' auto x = type{…} '初始化语法和'显式'转换操作符- clang vs gcc
- 是否有方法为任何指针类型定义转换操作符