我正在尝试类似这样的东西:
Foo & operator=(Foo & to, const Bar &from);
但是我遇到了这个错误:
E2239 'operator =(Foo &, const Bar &)' must be a member function
有哪些限制条件规定了哪些运算符可以/不可以作为自由函数来定义?如果有,为什么会有这些限制条件?
我正在尝试类似这样的东西:
Foo & operator=(Foo & to, const Bar &from);
但是我遇到了这个错误:
E2239 'operator =(Foo &, const Bar &)' must be a member function
有哪些限制条件规定了哪些运算符可以/不可以作为自由函数来定义?如果有,为什么会有这些限制条件?
赋值运算符必须是非静态成员函数,并且必须只有一个参数:
赋值运算符应由一个非静态成员函数实现,并且只有一个参数(C++03 13.5.3/1)。
operator()
、operator[]
和 operator->
必须也被实现为非静态成员函数。
类特定的operator new
和operator delete
(以及其变体)必须作为静态成员函数实现(请注意,即使没有使用static
关键字声明,它们也是隐式静态的)。
它不能。
我猜原因与复制构造函数有关。它们具有非常相似的语义,而且你不能像其他构造函数一样在类外定义复制构造函数。所以,他们不想把这对双胞胎分开太远(以避免双胞胎悖论)。
P.S. 在C++中令人遗憾的是,你不能向现有类添加成员。这没有低级别的原因。如果可能的话,你可以通过不在类定义头文件中声明私有函数来解耦头文件和cpp依赖项。
三个
(即拷贝构造函数,赋值运算符和析构函数)复制控制函数之一,所以将其作为成员函数是合理的。但是其他函数为什么也要这样呢? - Joey.Z