依赖隐式声明的移动构造函数是否安全?

Ole*_*siy 2 c++ copy move move-constructor c++11

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

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

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

我的问题是:

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

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

Die*_*ühl 5

以下是您的问题的答案:

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