c++ - 依赖隐式声明的 move 构造函数是否安全?

标签 c++ c++11 copy move move-constructor

这是我获得大部分信息的地方:http://en.cppreference.com/w/cpp/language/move_constructor

显然,这些是隐式生成的 move 构造函数工作的条件:

  • 没有用户声明的复制构造函数
  • 没有用户声明的复制赋值运算符
  • 没有用户声明的 move 赋值运算符
  • 没有用户声明的析构函数
  • 隐式声明的 move 构造函数未定义为已删除
  • 如果存在用户声明的 move 构造函数,仍然可以使用关键字 default 强制生成隐式声明的 move 构造函数

我的问题是:

  1. 依赖隐式自动 move 构造函数安全吗?
  2. 如何检查它是否确实有效而不是默认的复制构造函数?
  3. 最后,也是最重要的一点,这是一个好主意吗?为什么?还是定义我自己的总是更好?

我更倾向于遵循三规则并手动创建析构函数、复制和 move 构造函数以及复制和 move 赋值运算符,但我只是对此感到好奇>隐式一个。

最佳答案

以下是您问题的答案:

  1. “安全”是什么意思?当规则适用时,即子对象是可 move 的,并且您没有做任何事情来破坏 move 构造函数的生成,它将被创建并在存在时使用。但请注意,很容易有一个不可 move 的子对象,这会在某种程度上无形地抑制 move 构造函数的创建。
  2. 要查看您的类是否有 move 构造函数,只需在使用复制和 move 构造函数时临时添加一个空的基本日志记录,并强制 move/复制对象:它将记录相应使用的构造函数。
  3. 没有任何代码通常比任何代码都好。

关于c++ - 依赖隐式声明的 move 构造函数是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18424183/

相关文章:

c++ - 理解 GCC 中的 std::pow 实现

c++ - 无锁堆栈 : visibility issue when checking hazard pointers during pop()?

sql - 如何更改 Azure 数据库的所有者

c++ - 友元函数范围和声明点

c++ - 从 map 中检索后 map 中的对象损坏

c++ 11 std数组-gcc和visual studio之间的区别

dll - 具有 native 依赖和复制文件的 Maven 项目

objective-c - 使用与 NSScrollview 相同的复制技术

c++ - wchar的内容被删除

python - 我有一个带有 C++11 代码的 CPython C++ 模块,但我似乎无法在 travis-ci 上构建