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

时间:2017-06-13 07:40:06

标签: c++ c++11 visual-c++ enums operator-overloading

以下代码在我检查过的所有编译器(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。 编译器错误呢?

1 个答案:

答案 0 :(得分:7)

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

[over.built/1]

  

表示内置运算符的候选运算符函数   条款[expr]中定义的内容在本子条款中规定。这些   候选函数参与运算符重载决策   [over.match.oper]中描述的过程并没有用于其他过程   目的。 [注意:因为内置运算符只使用操作数   非类型,运算符重载解析只发生在   操作数表达式最初具有类或枚举类型,运算符   重载分辨率只有在一个时才可以解析为内置运算符   operand有一个类类型,它具有用户定义的转换为a   适用于运算符的非类类型,或者当操作数具有的类时   枚举类型,可以转换为适合的类型   运营商。还要注意一些候选运算符函数   本子条款中给出的内容比内置更宽松   经营者自己。如[over.match.oper]中所描述的那样   通过表达式的重载决策选择内置运算符   符合条款中给出的内置操作符的要求   [expr],因此给出任何额外的语义约束   那里。 如果有一个用户写的候选人具有相同的名称和   参数类型作为内置候选运算符函数,   内置的运算符函数是隐藏的,不包含在集合中   候选人职能。 - 结束说明]

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