gpt4 book ai didi

C++ 零规则 & 什么是 "user-declared"构造函数?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:43:01 24 4
gpt4 key购买 nike

根据 Lightness Races in Orbit 的说明,我缩小了我的帖子范围。

看完这篇文章:The Rule of Zero ,

我明白了最多,但我还是想解决一些我遇到的不明白的问题:

1.看这个短语:

If the definition of a class X does not explicitly declare a move constructor, one will be implicitly declared as defaulted if and only if:

X does not have a user-declared copy constructor, and

X does not have a user-declared copy assignment operator,

X does not have a user-declared move assignment operator,

X does not have a user-declared destructor, and

The move constructor would not be implicitly defined as deleted.

应该所有 5 个语句共存(共享“和”关系)还是仅其中一些(共享“或”关系)?

2.用户声明的”复制构造函数\复制赋值运算符...是什么意思?

  • 是否在 .h 文件中声明它(以上列表中的任何一个)但未实现它被认为是用户声明的?

  • 在 .h 文件中声明它(以上列表中的任何一个)并指定“=deleted”或“=default”被认为是用户-宣布?

  • 是否在带有空手镯的 .h 文件中声明它(以上列表中的任何一个),{},视为用户声明?

恭敬地,

易趣

最佳答案

用户声明的构造函数是程序员编写的构造函数,而不是由编译器添加的。在这种情况下,“用户声明”与“隐式声明”相反。

您的类将有一个隐式声明的默认移动构造函数,除非您的类中发生任何此类情况。所以,它是一个“负与”。它们都必须碰巧获得隐式声明的默认移动构造函数。

在您提到的所有情况下,构造函数都是用户声明的,即使在删除时也是如此。

这些规则的原因是为了与 C++11 之前的版本兼容。当用户声明一个复制构造函数时,临时对象也被发送给他们。如果你使用 C++11 编译器,并且移动构造函数是不分青红皂白地隐含的,那么行为就会改变。之前调用复制构造函数,现在转到用户可能不知道的幻像移动构造函数。

因此,每次编译器看到复制构造函数或赋值运算符(意​​味着该类管理自己的资源)时,行为都会回退到 C++11 之前的版本,并且不会隐式声明移动构造函数。

关于C++ 零规则 & 什么是 "user-declared"构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40959659/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com