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

时间:2011-10-19 15:32:34

标签: c++ class copy

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

nocopy A;
nocopy B;
A = B;

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

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

3 个答案:

答案 0 :(得分:54)

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

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

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

但是,在C ++ 11中,您可以 Explicitly delete special member functions

例如:

struct NonCopyable {
    NonCopyable & operator=(const NonCopyable&) = delete;
    NonCopyable(const NonCopyable&) = delete;
    NonCopyable() = default;
};

答案 1 :(得分:5)

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

boost::noncopyable派生将为您完成这项工作。

答案 2 :(得分:4)

如果从boost::noncopyable继承,则在尝试复制构造函数时会出现编译时错误。我发现使用此错误消息(使用MSVC)是无用的,因为它们通常不指向导致错误的行。另一种方法是声明一个拷贝构造函数private并保持未定义,或者用BOOST_STATIC_ASSERT(false)定义它。如果您正在使用C ++ 11,您还可以delete复制构造函数:

class nocopy
{
    nocopy( nocopy const& ) = delete;
};