c++ - 不可复制的成员是否可以用作使对象不可复制的替代方法?

标签 c++ c++11

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

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

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

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

最佳答案

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

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

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

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

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

关于c++ - 不可复制的成员是否可以用作使对象不可复制的替代方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52570472/

相关文章:

c++ - 字符串常量之前的预期标识符

c++ - FreeBSD 内核中是否有用于 Malloc 调用的标志 "M_FAST"?

c++ - 模板类二重载函数

c++ - 在 C++ 中使用调试/发布版本 DLL

c++ - 从二进制内容中识别 7z SFX

c++ - 如何使用 C++ 使用 ODBC 驱动程序 API 将数据绑定(bind)到 SQLBindCol

c++ - 通过引用使用 vector<int>::iterator 但有错误

c++ - 在 key 之外的其他东西上订购容器

c++ - std::sort 是否检查 vector 是否已经排序?

c++ - 为什么 std::shared_ptr 不使用引用链接?