【问题标题】:Is copying automatically prohibited in classes derived from classed derived from Boost noncopyable?从 Boost 不可复制派生的类派生的类中是否自动禁止复制?
【发布时间】:2011-10-15 09:14:49
【问题描述】:

例如:

class Foo : boost::noncopyable
{
    // ...
};

class Bar : public Foo
{
    // ...
};

Bar 不可复制吗?

【问题讨论】:

  • +1,因为这是一个非常完善的问题。我认为答案有点明显是不相关的。 :)
  • 在它变得明显之前我不得不考虑一下。我很惊讶没有人问过这个问题。

标签: c++ inheritance boost noncopyable


【解决方案1】:

默认情况下它是不可复制的,除非您创建自定义复制构造函数并避免在那里调用基本复制构造函数。

另请参阅 C++11 中引入的 Explicitly-defaulted and deleted special member functions。尽管将复制构造函数/操作符设为私有可以解决问题,但编译器会生成一个远非漂亮和明显的诊断消息,因此 C++11 中存在已删除的复制构造函数/操作符来解决此问题。

【讨论】:

  • ..这几乎肯定会被“破坏”。
  • @Tomalak:是的 :-) 但还是有可能的,呵呵。
【解决方案2】:

假设派生类没有自定义复制构造函数来避免调用不可复制的复制构造函数,那么是的。在所有级别上,boost::noncopyable 的所有派生类都是不可复制的。由于派生类的对象还包含boost::noncopyable的子对象non-copyable,这意味着没有可复制的基类,任何派生类都不能复制,

【讨论】:

    【解决方案3】:

    Bar 派生自 boost::noncopyable(尽管它不是直接继承),所以是的。

    【讨论】:

      【解决方案4】:

      是的,如果它是可复制的,那么所有基类都必须是可复制的,但 boost::noncopyable 是不可复制的

      【讨论】:

      • "如果它[是]可复制的,那么所有派生类都必须是可复制的" struct Bar : struct Foo, boost::noncopyable {};。 Foo 是可复制的(比如说),但 Bar 不是。
      • @Tomalak:是的,我把basederived 搞混了——现在修复了
      猜你喜欢
      • 2015-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-03
      • 2013-01-14
      • 1970-01-01
      • 1970-01-01
      • 2022-10-01
      相关资源
      最近更新 更多