class A
{
public:
A& operator+(const A&){..........;}
};
A operator+(A& one, const A& two){......;}
int main()
{
A a,b,c;
c= a+b;
return 0;
}
在上面的代码中会调用哪个+操作符呢?
首先说下中缀调用和函数调用
c= a+b; //操作符的中缀调用.
c= a.operator+(b); //操作符的函数调用.
其实在这里的代码是有二义性的,这里是对操作符的中缀调用,在对操作符进行查找时,中缀调用不仅要把左参数类型中的函数考虑进来,也要把包含了左参数这个类的空间中的函数考虑进来,所以在这里
1.编译器发现A这个类中有个+操作符函数,
2.编译器再去全局空间(包含了A类的空间)中找,结果也发先了一个+操作符,
3.被找到的两个操作符都能完全符合匹配规则
4.编译器不知道雕哪个好,于是产生了2义性
如果是
c= a.operator+(b);
操作符函数调用就不用考虑那么多了,直接在A类中找匹配函数接可以了.