首页 > 解决方案 > 这是什么意思移动操作永远不会被定义为删除的功能

问题描述

我正在阅读 C++ 入门 5 版。直到第 13 章谈到“移动操作”时:

与复制操作不同,移动操作永远不会隐式定义为删除函数。但是,如果我们明确要求编译器使用 = default(第 7.1.4 节,第 264 页)生成移动操作,并且编译器无法移动所有成员,则移动操作将被定义为删除。除了一个重要的例外,合成移动操作被定义为删除的规则类似于复制操作的规则(第 13.1.6 节,第 508 页):

  • 与复制构造函数不同,如果类有一个定义了自己的复制构造函数但没有定义移动构造函数的成员,或者如果该类有一个没有定义自己的复制操作的成员并且编译器无法为其合成移动构造函数。对于移动分配也是如此。
  • 如果类有一个成员,其自己的移动构造函数或移动赋值运算符被删除或不可访问,则移动构造函数或移动赋值运算符被定义为已删除。
  • 与复制构造函数一样,如果析构函数被删除或不可访问,则移动构造函数被定义为已删除。
  • 与复制赋值运算符一样,如果类具有 const 或引用成员,则将移动赋值运算符定义为已删除。

标签: c++copy-constructormove-constructor

解决方案


这是否意味着复制操作被隐式定义为删除操作?如果是,什么时候?

是的。

当成员不能被复制时(例如它们是不可复制的类型)。


所以我不明白“与复制操作不同,移动操作永远不会隐式定义为删除函数”。

  • 当成员不能被复制时,复制构造函数被删除。
  • 当成员不能被移动时,移动构造函数不会被删除。相反,它根本不存在,因此改为执行副本。
    • 除非复制构造函数被删除!那你就什么也做不了。

如果删除了移动构造函数,则会立即出现编译错误,而不是尝试使用复制构造函数。


换句话说,请解释隐式移动操作与其相应的复制操作之间的区别。

这里的关键是不声明某事将其声明为已删除之间的区别


我不知道为什么这本书在这方面做了这么大的事情。仅当复制构造函数有时被隐式删除很有趣时,差异才有意义。删除复制构造函数并不是特别有趣,因为如果没有删除,您仍然不会得到副本。没有其他构造函数可以依靠。好吧,我想,鉴于我认为可能存在其他一些隐式转换序列,所以这有点有趣。


推荐阅读