移动构造函数会自动生成吗?

42

我有一个包含许多STL容器的大类。
编译器会自动创建一个移动构造函数,将这些容器移动到目标位置吗?还是我需要自己创建一个?

2个回答

63

当满足以下条件时,类X的移动构造函数会被隐式声明为默认值:

  • X没有用户声明的复制构造函数,
  • X没有用户声明的复制赋值运算符,
  • X没有用户声明的移动赋值运算符,
  • X没有用户声明的析构函数,并且
  • 移动构造函数不会被隐式定义为已删除。

例如,如果你的类有一个没有移动构造函数的类类型数据成员,即使它没有声明任何复制/移动构造函数,它也不会获得移动构造函数,因为隐式声明的移动构造函数会因为那个数据成员而被定义为已删除。


7
有趣的是,用户声明的移动构造函数并不会阻止编译器隐式声明复制构造函数。也许这值得在这里提一下。至少这是http://www.cprogramming.com/c++11/rvalue-references-and-move-semantics-in-c++11.html上所说的。 - Tobias
8
有趣的是,所有成员都需要有一个移动构造函数。将可以移动的所有成员移动,将不能移动的成员复制似乎是合理的做法。 - Kevin Cox
1
因此,最好的方法是为自己定义移动构造函数,不要依赖编译器。 - Deqing
1
通常保证移动构造函数不会抛出异常,而复制构造函数可能会抛出异常(例如内存不足),因此这可能不是一个好主意。你可以说“没关系,隐式移动构造函数也不会是noexcept”,但我仍然认为存在意外错误的可能性。 - Arthur Tacca
1
最好使用显式默认的移动构造函数:https://dev59.com/NGMl5IYBdhLWcg3wknwT - anton_rh
显示剩余2条评论

4

默认移动构造函数通常与默认复制构造函数绑定在一起。当您获得一个时,您会获得另一个。然而,如果您编写了复制构造函数/赋值运算符,则不会编写默认的复制和移动构造函数/赋值运算符。如果您编写其中一个集合,您必须编写它们全部。


1
根据cppreference的说明,即使用户有显式移动构造函数,也会提供隐式复制构造函数。 - Shiladitya Mukherjee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接