首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >什么意思移动操作从未被定义为已删除的函数?

什么意思移动操作从未被定义为已删除的函数?
EN

Stack Overflow用户
提问于 2020-02-02 19:39:11
回答 1查看 215关注 0票数 0

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

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

  • 与复制构造函数不同,如果类的成员定义了自己的复制构造函数,但也没有定义移动构造函数,或者类的成员没有定义自己的复制操作,且编译器无法合成移动构造函数,则移动构造函数被定义为已删除。同样,对于move-assignment.
  • The移动构造函数或移动赋值操作符,如果类的成员的移动构造函数或移动赋值运算符被删除,或者将复制构造函数定义为inaccessible.
  • Like,则移动构造函数定义为已删除,如果析构函数被删除,或者将复制赋值操作符inaccessible.
  • Like,则如果类具有const或引用成员,则移动赋值操作符被定义为已删除。

因此,我不明白“与复制操作不同,移动操作从未被隐式定义为已删除的函数”。

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

  • ,换句话说,请解释隐式移动操作与它们相应的副本操作之间的区别。
EN

回答 1

Stack Overflow用户

发布于 2020-02-02 21:01:59

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

是。

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

因此,我不明白“与复制操作不同,移动操作从未被隐式定义为已删除的函数”。

  • 当成员无法复制时,复制构造函数将被删除。当成员不能移动时,
  • 则不会删除移动构造函数。相反,它根本不存在,因此将执行一个副本。除非复制构造函数已被删除,否则
    • !那你就不能做anything.

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

换句话说,

请解释隐式移动操作与它们相应的副本操作之间的区别。

这里的关键是the difference between , and

我不知道这本书为什么这么大惊小怪。只有当复制构造函数有时被隐式删除时,这种区别才是有趣的。删除复制构造函数并不特别有趣,因为如果不删除,您仍然无法得到副本。就没有其他构造函数可供依赖了。嗯,我想,考虑到其他一些隐式转换序列,我想可能会有,所以这有点有趣。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60029842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档