具有不可复制成员的类被称为也是不可复制的。从 SO 开始,要使类不可复制,这些是选项:
- 使用 boost::noncopyable
- 将构造函数和赋值运算符声明为私有(private)。
删除复制构造函数。
class foo { private: std::mutex _dummy; };
问题:为了类似的目的和简单起见,包含一个虚拟的不可复制的成员是否会被使用?缺点是什么?
最佳答案
自 C++11 起,使类不可复制的正确习惯用法是 = delete
复制构造函数/赋值运算符。这就是 C++ 程序员被告知要做的,也是其他 C++ 程序员在您的类中寻找该行为时期望看到的。
有一个不可复制的子对象(成员或基类)很好,因此您的默认复制构造函数/赋值运算符将被隐式删除。但是您应该只对恰好不可复制的子对象执行此操作。也就是说,你有一个 unique_ptr<T>
或 mutex
或者作为成员(member)的任何东西,因为你需要 unique_ptr<T>
或 mutex
作为类实例数据。不是因为您将其用作使类型不可复制的技巧。
为此目的使用成员子对象的缺点是:
它混淆了代码的含义。你的
mutex _dummy;
例子告诉我你的类型有一个mutex
在里面。如果没有任何东西使用该变量,那么这告诉我您的代码相当不连贯;如果不需要子对象,则无需声明。= delete
是正确的成语,所以它是你应该使用的。boost::noncopyable
是 C++98/03 的习惯用法,因为它是一个空类。因此,常见的空基优化将确保它不会占用派生类中的任何空间。空成员没有这样的优化,所以成员boost::noncopyable
总是会让你的类(class)更大,没有任何优势。虽然您可以指出即将推出的 C++20[[no_unique_address]]
属性,请参阅原因 #1。
关于c++ - 不可复制的成员是否可以用作使对象不可复制的替代方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52570472/