可以使用不可复制的成员作为使对象不可复制的替代方法吗?

时间:2018-09-29 16:46:56

标签: c++ c++11

具有不可复制成员的类也被称为不可复制。从SO来说,要使类不可复制,可以使用以下选项:

  1. 使用boost :: noncopyable
  2. 将构造函数和赋值运算符声明为私有。
  3. 删除副本构造函数。

    class foo 
    {
        private:
          std::mutex _dummy;
    };
    

问题:是否将包含虚拟不可复制成员用于类似目的和简化?不利之处是什么?

1 个答案:

答案 0 :(得分:3)

自C ++ 11起,使类不可复制的适当习惯是= delete复制构造函数/赋值运算符。这就是C ++程序员被告知要做的事情,也是其他C ++程序员在查找类中的行为时期望看到的东西。

最好有一个不可复制的子对象(成员或基类),因此默认的复制构造函数/赋值运算符将被隐式删除。但是,您应该只对可能是无法复制的子对象执行此操作。也就是说,您拥有unique_ptr<T>mutex或其他成员,因为您 需要unique_ptr<T>mutex作为类实例数据。并不是因为您将其用作一种使该类型不可复制的技巧。

为此目的使用成员子对象的缺点是:

  1. 它混淆了代码的含义。您的mutex _dummy;示例告诉我,您的类型中包含mutex。如果没有任何人使用该变量,那么这告诉我您的代码相当不连贯。如果不需要子对象,则无需声明一个。 = delete是适当的习惯用法,因此应使用它。

  2. boost::noncopyable是C ++ 98/03惯用语,因为它是一个空类。因此,常见的空基优化将确保它不会在派生类中占用任何空间。空成员没有得到这样的优化,因此成员boost::noncopyable总是会使您的类变大,而没有优势。虽然您可以指向即将到来的C ++ 20 [[no_unique_address]]属性,但请参阅原因1。