[英]How does boost::noncopyable work
在我的C ++实践中,我偶然发现了两个愚蠢的问题:
c ++拷贝构造函数和赋值运算符中的AFAIK不是继承的......那么在这种情况下boost :: noncopyable如何帮助禁止这些东西呢?
\n class X:private boost :: noncopyable\n {\n };\n是否有必要仅使用私有继承来实现目标?
是否只有一种方法来声明赋值运算符
\n MyClass&operator =(const MyClass&);\n申报是否同样如此
\n void operator =(const MyClass&);要么
\n const MyClass&operator =(const MyClass&);?
您是正确的,不会继承复制构造函数和复制赋值运算符。 幸运的是,我们不需要继承它们才能使其工作。 如果继承自无法复制的类,则无法复制该派生类,也无法在其复制构造函数中调用基类复制构造函数。
你必须从一个看起来像的类继承
struct NonCopyable {
NonCopyable & operator=(const NonCopyable&) = delete;
NonCopyable(const NonCopyable&) = delete;
NonCopyable() = default;
};
这足以阻止编译器在派生类中生成的副本和赋值工作。 你可以提供自己的并覆盖它,但那就是打败了这一点。
C ++ 11及更高版本中的不可复制将通过声明它=delete
,最好是公共的。 但是,在C ++ 11之前,这是不可能的,并且正在使用2种技术的组合:
通过将该方法设为私有,非友元类不能调用此方法。 因此,任何试图调用此代码的代码都将导致编译错误。
在实践中,该类仍然可以自我复制。 因此,此方法未实现,您将收到链接器错误。
从boost::noncopyable
继承将阻止第二个用例,但是,它也会阻止编译器生成有效的默认复制构造函数......因为它们将违反先前的约束。
请注意,如果您确实需要,可以通过调用这些“不可复制”类的常规构造函数来为继承类编写复制构造函数。
对于你的第二个问题:是的,你可以给它任何你想要的返回类型,尽管你不能写a = b = c;
了。
1)构造对象时,还必须构造所有成员对象和基础对象。 由于noncopyable::noncopyable(const noncopyable &)
是私有的,因此不能复制构造noncopyable
。 因此,任何包含它作为成员或基础的对象也不能复制构造。
2)您可以通过您描述的三种方式中的任何一种声明赋值运算符。 不,他们不是“同一件事”。 一个返回一个可变引用,一个返回一个const引用,一个返回void。 如果您尝试操作赋值运算符的结果,则差异将很明显。 考虑这个程序片段:
a = b;
(a = b).foo()
第一行将与任何赋值运算符一样运行。 第二行将根据您使用的赋值运算符而有所不同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.