自由函数运算符==()或成员函数运算符==()中哪个优先?

meg*_*ium 1 c++ c++11 c++14 c++17

当同时定义了自由运算符函数和成员运算符函数时,使用哪一个进行比较?

#include <iostream>

class A;
class B;

bool operator==(const A &a, const B &b){ return true; };

class A
{
  public:
      bool operator==( const B &rhs ){ return false; };
};

class B
{
};

int main( int argc, char **argv )
{
  A a;
  B b;
  if( a == b )
  { 
      std::cout << "a==b" << std::endl;
  }
};
Run Code Online (Sandbox Code Playgroud)

我运行了几次代码,似乎成员运算符胜出了。总是这样吗?

Bar*_*rry 5

我运行了几次代码,似乎成员运算符胜出了。

是的,该成员在您的榜样中获胜。但这不是您想的原因。

成员函数具有隐式对象参数(this指向的对象),并且对象参数的类型由成员函数末尾的cv限定符确定。在这种情况下,您的成员运算符没有cv限定词,因此隐式对象的类型为simple A

基本上,我们有两个候选人:

bool operator==(A const&, B const&); // your non-member operator
bool operator==(A&,       B const&); // your member operator
Run Code Online (Sandbox Code Playgroud)

成员运算符是更好的匹配,因为第一个参数是更好的匹配-我们不必对进行更多的const限定引用a

如果您已经聘请了您的操作员const(通常应该这样做),那么我们将有以下两个候选人:

bool operator==(A const&, B const&); // your non-member operator
bool operator==(A const&, B const&); // better member operator
Run Code Online (Sandbox Code Playgroud)

两者是相同的,没有理由彼此偏爱,我们会产生歧义。没有规则优先于非成员函数的成员(反之亦然)。