为什么MSVC中的枚举的==运算符重载是不明确的

hip*_*cam 7 c++ enums operator-overloading visual-c++ c++11

以下代码在我检查过的所有编译器(clang,mingw,g ++)上编译得很好,而不是MSVC.

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;
}
Run Code Online (Sandbox Code Playgroud)

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)'
Run Code Online (Sandbox Code Playgroud)

任何见解都会很棒,我整天都在为此烦恼不已.

我的MSVC版本是14.0但是我已经在线测试了版本19.00.23506并且出现了同样的错误.

但是,该错误并不适用于版本19.11.25331.0.编译器错误呢?

Sto*_*ica 7

对于枚举,有一个内置的比较运算符.当您定义自己的内置时,内置应该会自动隐藏.

[over.built/1]

表示子句[expr]中定义的内置运算符的候选运算符函数在本子条款中指定.这些候选函数参与[over.match.oper]中描述的运算符重载解析过程,并且不用于其他目的.[注意:因为内置运算符只接受具有非类型类型的操作数,并且仅当操作数表达式最初具有类或枚举类型时才会发生运算符重载解析,因此只有当操作数具有操作数时,运算符重载解析才能解析为内置运算符一种类型,具有用户定义的转换为适合于运算符的非类型类型,或者当操作数具有可以转换为适合运算符的类型的枚举类型时.另请注意,本子条款中给出的一些候选运算符函数比内置运算符本身更宽松.如[over.match.oper]中所述,在通过重载决策选择内置运算符之后,表达式符合Clause [expr]中给出的内置运算符的要求,因此符合给定的任何其他语义约束那里.如果存在具有与内置候选运算符函数相同的名称和参数类型的用户编写候选,则内置运算符函数被隐藏并且不包括在候选函数集中. - 结束说明]

要回答你的问题,是的,这似乎是一个编译器错误.