C++ 零法则 &什么是“用户声明的”构造函数?

C++ Rule of Zero & what is "user-declared" constructor?

提问人:Etay 提问时间:12/4/2016 最后编辑:CommunityEtay 更新时间:9/7/2022 访问量:1526

问:

Lightness Races in Orbit 的澄清后,我缩小了我的帖子范围。

看完这篇文章:零法则

我最了解,但我仍然想解决一些不清楚的问题:

1.看这句话:

如果类 X 的定义未显式声明移动构造函数,则当且仅当以下情况时,类 X 将被隐式声明为默认值:

X 没有用户声明的复制构造函数,并且

X 没有用户声明的复制分配运算符,

X 没有用户声明的移动赋值运算符,

X 没有用户声明的析构函数,并且

移动构造函数不会被隐式定义为已删除。

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

2. 什么“用户声明的”复制构造函数\复制赋值运算符...方法?

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

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

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

恭敬地

埃泰

C++ 零法则

评论

0赞 Lightness Races in Orbit 12/4/2016
这似乎是一个很多问题。
1赞 Etay 12/4/2016
好吧,我希望避免提出单独的问题,因为我认为这是一种负担。此外,在我看来,所有问题都在强调同一主题的不同细微差别。
0赞 Lightness Races in Orbit 12/4/2016
不,当您每个问题发布多个问题时,这更是一种负担。请缩小您的帖子范围。
0赞 Etay 12/4/2016
好的,谢谢你的澄清。我会这样做的。
1赞 Igor Tandetnik 12/4/2016
标准中的实际文本 [class.copy]/9 只有前四个要点,并清楚地表明所有四个要点都是 AND 在一起的。然后,它分别描述了声明为默认值的移动构造函数将被定义为删除的情况。

答:

4赞 ABu 12/5/2016 #1

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

您的类将具有隐式声明的默认移动构造函数,除非您的类中发生任何这种情况。所以,它是一个“否定和”。它们中的任何一个都不必碰巧才能获得隐式声明的默认移动构造函数。

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

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

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