public operator= 可以安全地声明而不是定义吗

-2 c++

在查看同事的代码时,我发现了一个有趣的行为。他声明了一个公共操作符=,但没有定义它,但代码似乎使用了默认的复制构造函数。好奇,我尝试了一下,发现当我尝试声明而不定义复制构造函数时,类似的事情会导致编译器错误。我试过的代码示例 -

class Classy
{
   public:      
      Classy& operator =(const Classy&);  // compiles, seems to use default copy CTor
      Classy(const Classy&);              // compiler error
      
      int a, b;
};


int main()
{
   Classy Foo;
   Classy Baz = Foo;    // compiles, seems to use default copy CTor
   Classy Bar(Foo);     // compiler error
}
Run Code Online (Sandbox Code Playgroud)

为什么 operator= 似乎在没有相应定义的情况下工作,但复制构造函数却没有?

小智 5

尽管=,Classy Baz = Foo;是副本,而不是作业;所以你丢失的赋值运算符永远不会被调用。

请注意,对于您所展示的类,没有理由指定复制或分配;编译器提供的默认值可以正常工作。如果你想说清楚,请使用= default

struct Classy
{    
      Classy& operator =(const Classy&) = default;
      Classy(const Classy&) = default;
      Classy() = default;
      
      int a, b;
};
Run Code Online (Sandbox Code Playgroud)

相反,如果您真的想摆脱运算符而不定义它,请使用=delete

struct Classy
{    
      Classy& operator =(const Classy&) = delete; // no assignment
      Classy(const Classy&) = delete; // no copy
      Classy() = default;
      
      int a, b;
};
Run Code Online (Sandbox Code Playgroud)