C ++赋值运算符可以是自由函数吗?

时间:2010-06-21 20:57:02

标签: c++ operator-overloading non-member-functions

我正在尝试这样的事情:

Foo & operator=(Foo & to, const Bar &from);

但是我收到了这个错误:

E2239 'operator =(Foo &, const Bar &)' must be a member function

对哪些运算符可以/不能定义为自由函数有限制,如果是,为什么?

2 个答案:

答案 0 :(得分:24)

赋值运算符必须是非静态成员函数,并且必须只有一个参数:

  

赋值运算符应由具有一个参数的非静态成员函数实现(C ++ 03 13.5.3 / 1)。

operator()operator[]operator->也必须作为非静态成员函数实现。

特定于类的operator newoperator delete(及其变体)必须作为静态成员函数实现(请注意,这些是隐式静态的,即使它们未使用static声明关键字)。

答案 1 :(得分:-1)

它不能。

我猜,原因与复制构造函数有关。它们具有非常相似的语义,并且,您无法像其他构造函数一样在类之外定义复制构造函数。因此,他们不想将双胞胎分开(避免双胞胎悖论:)。

P.S。 C ++中的耻辱是,您无法将成员添加到现有类中。这没有低级别的原因。如果可能的话,你可以通过不在类定义头中声明私有函数来解耦header和cpp依赖关系。