在 Lightness Races in Orbit 澄清之后,我已经缩小了我的职位。
阅读本文后:The Rule of Zero,
我最了解,但我仍然想解决一些不明确的问题:
1。看这句话:
如果类X的定义没有显式声明一个移动构造函数,那么只有在以下情况下才会将其隐式声明为默认值:
X没有用户声明的复制构造函数和
X没有用户声明的复制赋值运算符
X没有用户声明的移动赋值运算符
X没有用户声明的析构函数和
移动构造函数不会被隐式定义为已删除。
是否所有5个语句共存(共享"和"关系)或仅共享其中一些(共享"或"关系)?
2. 什么" 用户声明" copy constructor \ copy assignment operator ...是什么意思?
在.h文件中声明它(上面列出的任何一个)但是没有实现它被认为是用户声明的?
在.h文件中声明它(上面列出的任何一个)并指定" =已删除"或" =默认"被认为是用户声明的?
在带有空手镯{。}的.h文件中声明它(上面列表中的任何一个),被认为是用户声明的?
此致,
Etay
答案 0 :(得分:1)
用户声明的构造函数是一个由程序员编写的构造函数,而不是由编译器添加的。在这种情况下,用户定义与默认或隐式相反。
除非您的类中发生任何条件,否则您的类将具有隐式默认移动构造函数。所以,它是一个消极的"。它们都不会发生隐式默认移动构造函数。
我提到的所有情况,构造函数都被声明,即使被删除。
这些规则的原因是为了与C ++之前的复制兼容 - 11。当用户声明了一个拷贝构造函数时,临时代理也会发送给他们。如果你去一个C ++ 11编译器,并且不加思索地隐式移动构造函数,那么行为就会改变。之前调用复制构造函数的调用现在转到用户可能不知道的幻像移动构造函数。
因此,每次编译器看到复制构造函数或赋值运算符(意味着类管理自己的资源)时,行为都会回退到C ++ 11之前,并且不会考虑移动构造函数。