繁体   English   中英

boost :: noncopyable如何工作

[英]How does boost::noncopyable work

在我的C ++实践中,我偶然发现了两个愚蠢的问题:

  1. c ++拷贝构造函数和赋值运算符中的AFAIK不是继承的......那么在这种情况下boost :: noncopyable如何帮助禁止这些东西呢?

    \n class X:private boost :: noncopyable\n {\n };\n
    是否有必要仅使用私有继承来实现目标?

  2. 是否只有一种方法来声明赋值运算符

    \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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM