目前我正在阅读Scott Meyers的《 Effective Modern C++ 》一书,现在我在:第 17 条:理解特殊成员函数生成。
我的误解来自以下部分(理由):
这两个复制操作是独立的:声明一个不会阻止编译器生成另一个。因此,如果您声明了一个复制构造函数,但没有复制赋值运算符,然后编写需要复制赋值的代码,编译器将为您生成复制赋值运算符。同样,如果您声明了一个复制赋值运算符,但没有复制构造函数,但您的代码需要复制构造,编译器将为您生成复制构造函数。这在 C++98 中是正确的,在 C++11 中仍然是正确的。
这两个移动操作不是独立的。如果您声明其中一个,则会阻止编译器生成另一个。基本原理是,如果你为你的类声明一个移动构造函数,你就表明应该如何实现移动构造,这与编译器生成的默认成员移动不同。如果成员移动构造有问题,那么成员移动分配也可能有问题。因此,声明移动构造函数可防止生成移动赋值运算符,而声明移动赋值运算符可防止编译器生成移动构造函数。
我认为基本原理部分也可以应用于复制构造函数和复制赋值运算符对,不是吗?因此,如果我声明一个复制构造函数,我会用它表明默认的成员复制对我来说是不够的。如果我这么说,那么复制赋值运算符也应该是用户定义的。
我认为这是一本很棒的书,但在这一点上,我还不清楚这个理由。请帮我解释一下。谢谢。