嗯,这个:
private:
MyClass(const MyClass&) {}
MyClass& operator=(const MyClass&) {}
技术上仍然允许MyClass
供会员和朋友复制。当然,理论上这些类型和函数都在你的控制之下,但类仍然是copyable。至少与boost::noncopyable
and = delete
, nobody可以复制班级。
我不明白为什么有些人声称在 C++11 中使类不可复制更容易。
与其说“更容易”,不如说“更容易消化”。
考虑一下:
class MyClass
{
private:
MyClass(const MyClass&) {}
MyClass& operator=(const MyClass&) {}
};
如果您是一名 C++ 程序员,读过 C++ 的介绍性文本,但很少接触惯用的 C++(即:lotC++ 程序员),这……令人困惑。它声明了复制构造函数和复制赋值运算符,但它们是空的。那么为什么要声明它们呢?是的,他们是private
,但这只会提高more问题:为什么将它们设为私有?
要理解为什么这会阻止复制,您必须意识到,通过将它们声明为私有,您可以使非会员/朋友无法复制它。这对于新手来说并不是很明显。当他们尝试复制它时,也不会收到错误消息。
现在,将其与 C++11 版本进行比较:
class MyClass
{
public:
MyClass(const MyClass&) = delete;
MyClass& operator=(const MyClass&) = delete;
};
怎样才能理解这个类不能被复制呢?无非就是了解什么= delete
语法意思。任何解释 C++11 语法规则的书都会准确地告诉您它的作用。对于没有经验的 C++ 用户来说,这段代码的效果是显而易见的。
这个习语的伟大之处在于它成为一个习语,因为它是准确表达你的意思的最清晰、最明显的方式。
Even boost::noncopyable
需要多一点思考。是的,它被称为“不可复制”,因此它是自记录的。但如果您以前从未见过它,就会产生疑问。为什么你要从无法复制的东西中衍生出来?为什么我的错误消息谈到boost::noncopyable
的复制构造函数?等等。同样,理解这个习语需要更多的脑力劳动。