这意味着移动操作从未定义为已删除的函数

问题描述 投票:0回答:1

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

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

  • 与复制构造函数不同,如果该类具有定义其自己的复制构造函数但未定义移动构造函数的成员,或者该类具有未定义其自身复制成员的成员,则将move构造函数定义为已删除操作,并且编译器无法为其合成move构造函数。对于移动分配也是如此。
  • 如果类的成员具有自己的移动构造函数或移动分配运算符被删除或不可访问的成员,则将移动构造函数或移动分配运算符定义为已删除。
  • 与复制构造函数一样,如果析构函数被删除或不可访问,则将移动构造函数定义为已删除。
  • 与复制赋值运算符一样,如果类具有const或引用成员,则将移动赋值运算符定义为已删除。
  • 所以我不理解“与复制操作不同,移动操作永远不会隐式定义为已删除的功能”。

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

  • 换句话说,请说明隐式移动操作及其对应的复制操作之间的区别。

c++ copy-constructor move-constructor
1个回答
0
投票

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

[无法复制成员时(例如,它们是不可复制的类型)。


因此,我不理解“与复制操作不同,移动操作永远不会隐式定义为已删除的功能”。

  • 无法复制成员时,将删除复制构造函数。
  • 无法移动成员时,将删除移动构造函数not。相反,它根本不存在,因此将执行复制。
    • 除非复制构造函数被删除!那你什么也做不了。

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


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

这里的键是the difference between not declaring something, and declaring it as deleted


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

© www.soinside.com 2019 - 2024. All rights reserved.