首页 > 解决方案 > 可以使用不可复制的成员作为使对象不可复制的替代方法吗?

问题描述

具有不可复制成员的类也被称为不可复制。从 SO,为了使类不可复制,这些是选项:

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

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

问题:为了类似的目的和简单起见,是否会包含一个虚拟的不可复制成员?有什么缺点?

标签: c++c++11

解决方案


从 C++11 开始,使类不可复制的正确习惯用法是= delete复制构造函数/赋值运算符。这就是 C++ 程序员被告知要做的事情,这也是其他 C++ 程序员在你的类中寻找这种行为时所期望看到的。

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

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

  1. 它混淆了代码的含义。你的mutex _dummy;例子告诉我你的类型有一个mutex。如果没有人使用该变量,那么这告诉我您的代码相当不连贯;如果您不需要子对象,则无需声明子对象。= delete是正确的成语,所以它是你应该使用的。

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


推荐阅读