禁用编译器生成的复制赋值运算符

Mal*_*rba 35 c++ copy class

当我写一个类(比如说class nocopy)时,是否有可能完全阻止复制操作符的存在?如果我没有定义一个,而其他人写的东西就像

nocopy A;
nocopy B;
A = B;
Run Code Online (Sandbox Code Playgroud)

编译器将自动生成一个定义.如果我自己定义一个,我将阻止编译器自动生成,但上面的代码仍然是合法的.

我希望上面的代码是非法的,并生成编译时错误.我怎么做?

Alo*_*ave 61

您只需使用private访问说明符声明一个复制构造函数,甚至不定义它.
任何试图使用它的人都会因为声明它而得到编译错误private.

如果有人甚至间接使用它,您将收到链接错误.

你不能在C++ 03中做更多的事情.

但是,在C++ 11中,您可以显式删除特殊成员函数.

例如:

struct NonCopyable {
    NonCopyable & operator=(const NonCopyable&) = delete;
    NonCopyable(const NonCopyable&) = delete;
    NonCopyable() = default;
};
Run Code Online (Sandbox Code Playgroud)

  • 更进一步的是继承`boost :: noncopyable` (2认同)

thi*_*ton 5

通常的方法是将复制构造函数和赋值运算符声明为私有,这会导致编译错误,如Als所解释的那样.

从中获取boost::noncopyable将为您完成这项工作.