当我写一个班级(比如class nocopy
)时,是否有可能完全阻止复制操作符的存在?如果我没有定义一个,而其他人写的东西像
nocopy A;
nocopy B;
A = B;
编译器将自动生成定义。如果我自己定义一个,我将阻止编译器自动生成,但上面的代码仍然是合法的。
我希望上面的代码是非法的,并生成编译时错误。我该怎么做?
答案 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;
};