7

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

看完这篇文章:零法则

我明白了最多,但我仍然想解决我遇到的一些不清楚的问题:

1.看这句话:

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

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

X 没有用户声明的复制赋值运算符,

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

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

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

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

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

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

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

  • 是在 .h 文件中声明它(上面列表中的任何一个),其中包含空手镯 {},被认为是用户声明的?

尊敬,

易泰

4

1 回答 1

4

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

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

在您提到的所有情况下,即使被删除,构造函数也被声明使用。

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

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

于 2016-12-04T16:35:28.970 回答