代码之家  ›  专栏  ›  技术社区  ›  Roddy

C++赋值操作符可以是自由函数吗?

  •  16
  • Roddy  · 技术社区  · 15 年前

    我正在尝试这样的方法:

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

    但我得到了这个错误:

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

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

    2 回复  |  直到 9 年前
        1
  •  24
  •   James McNellis    10 年前

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

    赋值运算符必须由一个非静态成员函数来实现,它具有一个参数(C++ 03 135.3/1)。

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

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

        2
  •  -1
  •   Pavel Radzivilovsky    15 年前

    它不能。

    我想,原因与复制构造函数有关。它们具有非常相似的语义,并且,您不能像其他构造函数那样在类外部定义复制构造函数。所以,他们不想把双胞胎分开太远(为了避免双胞胎悖论)。

    P.S. C++中的一个耻辱是不能向现有的类添加成员。这是没有低级原因的。如果可能的话,可以通过不在类定义头中声明私有函数来分离头和cpp依赖项。