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)
我运行了几次代码,似乎成员运算符胜出了。总是这样吗?
我运行了几次代码,似乎成员运算符胜出了。
是的,该成员在您的榜样中获胜。但这不是您想的原因。
成员函数具有隐式对象参数(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)
两者是相同的,没有理由彼此偏爱,我们会产生歧义。没有规则优先于非成员函数的成员(反之亦然)。
| 归档时间: |
|
| 查看次数: |
82 次 |
| 最近记录: |