以下两个之间有什么区别吗?

时间:2014-03-23 04:51:39

标签: c++

我为+重载定义了一个全局非成员方法

喜欢

ClassA operator+(const ClassA& a, const ClassB& b);
{
   blah blah ;
}

在交际中,我可以使用

1)

ClassA operator+(const ClassB& b, const ClassA& a)
{
      return operator+(a,b);
}

2)

ClassA operator+(const ClassB& b, const ClassA& a)
{
       return a + b;
}

1和2之间有什么区别?

1 个答案:

答案 0 :(得分:1)

除了@barakmanos在评论中首先指出的显而易见的差异(“第二个更具可读性”),还有另一个技术差异。

假设一秒钟,以下定义:

struct B;

struct A
{
    void operator+(B const&) const { ::std::cout << "member\n"; }
    friend void operator+(A const&, B const&) { ::std::cout << "friend\n"; }
};

struct B { };

现在,请考虑以下三个陈述:

    operator+(A(), B());
    A().operator+(B());
    A() + B();

第一个显然叫朋友(免费)功能,第二个叫成员。但是,如果另一个没有定义,第三个将调用。在这种特殊情况下,它找不到更好的匹配,因此会形成错误。有几种方法可以修改此行为,例如如果成员函数在const - 要求中不同,则表达式可能是正确的,只会导致更大的过载集。

这证明了两个表达式的区别:operator+(a,b) 考虑自由函数而不是成员函数重载二元加运算符。

事实上,C ++标准有另一个例子:

A() + B() 执行与参数相关的查找,而operator+(A(), B())执行常规函数查找。这意味着以下是一个错误(取自C ++11§13.3.1.2.10):

struct A { };
void operator + (A, A);
struct B {
    void operator + (B);
    void f ();
};
A a;
void B::f() {
    operator+ (a,a); // error: global operator hidden by member
    a + a; // OK: calls global operator+
}