首页 > 后端开发 > C++ > C 中何时自动生成移动构造函数和移动赋值运算符?

C 中何时自动生成移动构造函数和移动赋值运算符?

Patricia Arquette
发布: 2024-11-28 05:23:13
原创
941 人浏览过

When Are Move Constructors and Move Assignment Operators Automatically Generated in C  ?

C 中的移动操作生成

在 C 98 中,为没有自定义定义的类自动生成复制构造函数和赋值运算符。然而,随着 C 11 中移动语义的引入,移动操作的生​​成需要进一步考虑。

自动生成移动操作

移动构造函数和移动赋值运算符仅在满足某些条件时自动生成:

  • 默认移动语义: 编译器生成执行对象数据成员按位移动的移动操作。
  • 没有用户定义的析构函数: 如果类具有用户定义的析构函数,则编译器不会自动生成移动操作。
  • 没有用户定义的复制操作:同样,如果一个类有用户定义的复制操作,编译器不会自动生成移动操作。

自动生成的例外

在某些情况下,不会自动生成移动操作,即使满足上述条件。例如:

  • 具有仅移动类型的类成员:如果类包含具有仅移动类型(即无法复制的类型)的成员,编译器无法自动生成移动操作。
  • 简单类:仅包含简单数据成员的类(例如,整数、字符串)具有隐式定义的复制和移动操作,因此编译器不会生成自定义实现。

其他信息

来自 ACCU 的 Howard Hinnant 演示2014年会议提供了一个综合表格,总结了自动生成特殊成员的规则,包括移动操作。幻灯片突出显示,已弃用的行为由红色方块表示。

为了确保正确处理移动语义,建议遵循 C 98/03 中的“3 规则”。这意味着如果声明了析构函数,则显式声明两个复制成员,或者声明至少一个复制成员。

以上是C 中何时自动生成移动构造函数和移动赋值运算符?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板