以下代码在我检查过的所有编译器(clang,mingw,g ++)上编译得很好。
enum class Foo{BAR};
bool operator==(Foo a, Foo b)
{
return (int)a & (int)b;
}
int main(int argc, char *argv[])
{
Foo::BAR==Foo::BAR;
return 0;
}
MSVC因以下错误而失败:
>main.cpp(10): error C2593: 'operator ==' is ambiguous
>main.cpp(3): note: could be 'bool operator ==(Foo,Foo)'
>main.cpp(10): note: while trying to match the argument list '(Foo, Foo)'
任何见解都会很棒,我一整天都在为此烦恼。
我的MSVC版本是14.0但是我已经在线测试了版本19.00.23506并且出现了同样的错误。
但是,错误并不适用于版本19.11.25331.0。 编译器错误呢?
答案 0 :(得分:7)
对于枚举,有一个内置的比较运算符。当您定义自己的内置时,内置应该会自动隐藏。
表示内置运算符的候选运算符函数 条款[expr]中定义的内容在本子条款中规定。这些 候选函数参与运算符重载决策 [over.match.oper]中描述的过程并没有用于其他过程 目的。 [注意:因为内置运算符只使用操作数 非类型,运算符重载解析只发生在 操作数表达式最初具有类或枚举类型,运算符 重载分辨率只有在一个时才可以解析为内置运算符 operand有一个类类型,它具有用户定义的转换为a 适用于运算符的非类类型,或者当操作数具有的类时 枚举类型,可以转换为适合的类型 运营商。还要注意一些候选运算符函数 本子条款中给出的内容比内置更宽松 经营者自己。如[over.match.oper]中所描述的那样 通过表达式的重载决策选择内置运算符 符合条款中给出的内置操作符的要求 [expr],因此给出任何额外的语义约束 那里。 如果有一个用户写的候选人具有相同的名称和 参数类型作为内置候选运算符函数, 内置的运算符函数是隐藏的,不包含在集合中 候选人职能。 - 结束说明]
回答你的问题,是的,这似乎是一个编译错误。