首页 >后端开发 >C++ >为什么早期 C 11 草案中没有隐式移动构造函数和赋值运算符?

为什么早期 C 11 草案中没有隐式移动构造函数和赋值运算符?

Linda Hamilton
Linda Hamilton原创
2024-12-06 10:18:13539浏览

Why Were Implicit Move Constructors and Assignment Operators Absent in Early C  11 Drafts?

早期 C 11 草案中的隐式移动构造函数和赋值运算符

尽管 C 中广泛实现了默认复制构造函数和赋值运算符,但C 11 标准的早期草案中缺少默认的移动构造函数和赋值运算符,这引起了人们的质疑

最初缺席的原因

移动操作的隐式生成一直是 C 社区中持续争论的主题。由于担心保留依赖于不可移动类型的代码,C 11 标准的早期草案缺乏这些隐式功能。此外,使用赋值运算符的 std::move 与不可移动对象的行为使问题变得复杂。

当前规范

根据 11 月 N3225 规范,如果类没有显式定义移动构造函数,它将在以下情况下隐式声明为默认值条件:

  • 没有用户声明的复制构造函数
  • 没有用户声明的复制赋值运算符
  • 没有用户声明的移动赋值运算符
  • 否用户声明的析构函数
  • 没有隐式删除移动构造函数

类似的条件适用于移动赋值运算符的隐式声明。这些更改与 N3203 和 N3201 中概述的原则一致,这些原则主张对隐式移动生成采用更严格的条件。

解决方法

在早期没有隐式移动操作的情况下C 11 草案中,一种解决方法是手动实现移动赋值运算符和移动构造函数。为了避免在每个类中实现这些运算符,可以采用宏解决方案。 GManNickG 在 Stack Overflow 问题中的回答提供了一个合适的例子。

以上是为什么早期 C 11 草案中没有隐式移动构造函数和赋值运算符?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn