Merge pull request #22 from jiapengwen/patch-2

Update item17.md
This commit is contained in:
kelthuzadx 2020-06-01 17:26:02 +08:00 committed by GitHub
commit 89e4a0bd3a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -19,7 +19,7 @@ public:
现在,当我对一个数据成员或者基类使用移动构造或者移动赋值,没有任何保证移动一定会真的发生。逐成员移动,实际上,更像是逐成员移动**请求**,因为对不可移动类型使用移动操作实际上执行的是拷贝操作。逐成员移动的核心是对对象使用**std::move**,然后函数决议时会选择执行移动还是拷贝操作。**Item 23**包括了这个操作的细节。本章中,简单记住如果支持移动就会逐成员移动类成员和基类成员,如果不支持移动就执行拷贝操作就好了。
两个拷贝操作是独立的:声明一个不会限制编译器声明另一个。所以如果你声明一个拷贝构造哈说但是没有声明拷贝赋值运算符如果写的代码用到了拷贝赋值编译器会帮助你生成拷贝赋值运算符重载。同样的如果你声明拷贝赋值运算符但是没有拷贝构造代码用到拷贝构造编译器就会生成它。上述规则在C++98和C++11中都成立。
两个拷贝操作是独立的:声明一个不会限制编译器声明另一个。所以如果你声明一个拷贝构造函数但是没有声明拷贝赋值运算符如果写的代码用到了拷贝赋值编译器会帮助你生成拷贝赋值运算符重载。同样的如果你声明拷贝赋值运算符但是没有拷贝构造代码用到拷贝构造编译器就会生成它。上述规则在C++98和C++11中都成立。
再进一步,如果一个类显式声明了拷贝操作,编译器就不会生成移动操作。这种限制的解释是如果声明拷贝操作就暗示着默认逐成员拷贝操作不适用于该类,编译器会明白如果默认拷贝不适用于该类,移动操作也可能是不适用的。
@ -115,4 +115,4 @@ class Widget {
记住:
+ 特殊成员函数是编译器可能自动生成的函数:默认构造,析构,拷贝操作,移动操作
+ 移动操作仅当类没有显式声明移动操作,拷贝操作,析构时才自动生成
+ 拷贝构造仅当类没有显式声明拷贝构造时才自动生成并且如果用户声明了移动操作拷贝构造就是delete。拷贝赋值运算符仅当类没有显式声明拷贝赋值运算符时才自动生成并且如果用户声明了移动操作拷贝赋值运算符就是delete。当用户声明了析构函数拷贝操作不再自动生成
+ 拷贝构造仅当类没有显式声明拷贝构造时才自动生成并且如果用户声明了移动操作拷贝构造就是delete。拷贝赋值运算符仅当类没有显式声明拷贝赋值运算符时才自动生成并且如果用户声明了移动操作拷贝赋值运算符就是delete。当用户声明了析构函数拷贝操作不再自动生成