c++ - 可以使用不可复制的成员作为使对象不可复制的替代方法吗?
问题描述
具有不可复制成员的类也被称为不可复制。从 SO,为了使类不可复制,这些是选项:
- 使用 boost::noncopyable
- 将构造函数和赋值运算符声明为私有。
删除复制构造函数。
class foo { private: std::mutex _dummy; };
问题:为了类似的目的和简单起见,是否会包含一个虚拟的不可复制成员?有什么缺点?
解决方案
从 C++11 开始,使类不可复制的正确习惯用法是= delete
复制构造函数/赋值运算符。这就是 C++ 程序员被告知要做的事情,这也是其他 C++ 程序员在你的类中寻找这种行为时所期望看到的。
拥有一个不可复制的子对象(成员或基类)很好,因此您的默认复制构造函数/赋值运算符将被隐式删除。但是您应该只对碰巧不可复制的子对象执行此操作。也就是说,您有一个unique_ptr<T>
ormutex
或任何东西作为成员,因为您需要aunique_ptr<T>
或 amutex
作为类实例数据。不是因为您将其用作使该类型不可复制的技巧。
为此目的使用成员子对象的缺点是:
它混淆了代码的含义。你的
mutex _dummy;
例子告诉我你的类型有一个mutex
。如果没有人使用该变量,那么这告诉我您的代码相当不连贯;如果您不需要子对象,则无需声明子对象。= delete
是正确的成语,所以它是你应该使用的。boost::noncopyable
是 C++98/03 习语,因为它是一个空类。因此,常见的空基优化将确保它不会占用派生类中的任何空间。空成员没有得到这样的优化,所以成员boost::noncopyable
总是会让你的班级更大,没有任何优势。虽然您可以指出即将到来的 C++20[[no_unique_address]]
属性,但请参阅原因 #1。
推荐阅读
- powershell - 如何在 PowerShell 中修复 DLL LoaderExceptions
- excel - 用户表单日期格式文本框
- java - 为 XNAT 导入 Gradle 项目的问题 - 未解决的类型
- r - 使用 ggplot2 对象和自定义字体从终端运行 R 脚本(字体类型无效)
- python - 实现metropolis-hasting算法
- java - 获取一个空的 json 实体并且不能使用 Spring Boot 在运行时持久化
- c - Memcpy char** 的 typedef,它指向具有 4 个 uint64_t 类型变量的结构
- python - Ansible/molecule:服务 docker 守护进程/引擎不会启动
- arrays - 从命令行读取值到数组
- html - 为什么在引导程序中我的手风琴菜单旁边有一个空矩形?