c++ - 这是什么意思移动操作永远不会被定义为删除的功能
问题描述
我正在阅读 C++ 入门 5 版。直到第 13 章谈到“移动操作”时:
与复制操作不同,移动操作永远不会隐式定义为删除函数。但是,如果我们明确要求编译器使用 = default(第 7.1.4 节,第 264 页)生成移动操作,并且编译器无法移动所有成员,则移动操作将被定义为删除。除了一个重要的例外,合成移动操作被定义为删除的规则类似于复制操作的规则(第 13.1.6 节,第 508 页):
- 与复制构造函数不同,如果类有一个定义了自己的复制构造函数但没有定义移动构造函数的成员,或者如果该类有一个没有定义自己的复制操作的成员并且编译器无法为其合成移动构造函数。对于移动分配也是如此。
- 如果类有一个成员,其自己的移动构造函数或移动赋值运算符被删除或不可访问,则移动构造函数或移动赋值运算符被定义为已删除。
- 与复制构造函数一样,如果析构函数被删除或不可访问,则移动构造函数被定义为已删除。
- 与复制赋值运算符一样,如果类具有 const 或引用成员,则将移动赋值运算符定义为已删除。
所以我不明白“与复制操作不同,移动操作永远不会隐式定义为删除函数”。
这是否意味着复制操作被隐式定义为删除操作?如果是,什么时候?
换句话说,请解释隐式移动操作与其相应的复制操作之间的区别。
解决方案
这是否意味着复制操作被隐式定义为删除操作?如果是,什么时候?
是的。
当成员不能被复制时(例如它们是不可复制的类型)。
所以我不明白“与复制操作不同,移动操作永远不会隐式定义为删除函数”。
- 当成员不能被复制时,复制构造函数被删除。
- 当成员不能被移动时,移动构造函数不会被删除。相反,它根本不存在,因此改为执行副本。
- 除非复制构造函数被删除!那你就什么也做不了。
如果删除了移动构造函数,则会立即出现编译错误,而不是尝试使用复制构造函数。
换句话说,请解释隐式移动操作与其相应的复制操作之间的区别。
我不知道为什么这本书在这方面做了这么大的事情。仅当复制构造函数有时被隐式删除很有趣时,差异才有意义。删除复制构造函数并不是特别有趣,因为如果没有删除,您仍然不会得到副本。没有其他构造函数可以依靠。好吧,我想,鉴于我认为可能存在其他一些隐式转换序列,所以这有点有趣。
推荐阅读
- php - centos如何安装curl php
- reactjs - 我无法将我的图像文件链接到我的反应文件
- android-sdk-tools - 在 POP OS 20.04 上启动模拟器时 Android Studio 4.0.1 错误“无法找到 adb”
- python - 如何制作具有多个系列和计数的条形图
- c - 使用递归尝试在 c 中创建降序列表时出现问题
- or-tools - 在 Google Or-Tools 上,我们如何在 Vehicles 上设置时间窗口?
- makefile - makefile 调用其他 makefile 的最佳实践
- tensorflow2.0 - 我使用 tensorflow2 识别验证码图像,但发生了一些错误
- javascript - 在鼠标悬停效果中添加2-3张图片
- javascript - 将文件链接到 html 文档时,Javascript 文件不起作用