mirror of
https://github.com/CnTransGroup/EffectiveModernCppChinese.git
synced 2024-12-28 05:40:43 +08:00
Update item17.md
翻译段落少了
This commit is contained in:
parent
a71fbb9d7a
commit
73f3699866
@ -21,6 +21,8 @@ public:
|
||||
|
||||
两个拷贝操作是独立的:声明一个不会限制编译器声明另一个。所以如果你声明一个拷贝构造哈说,但是没有声明拷贝赋值运算符,如果写的代码用到了拷贝赋值,编译器会帮助你生成拷贝赋值运算符重载。同样的,如果你声明拷贝赋值运算符但是没有拷贝构造,代码用到拷贝构造编译器就会生成它。上述规则在C++98和C++11中都成立。
|
||||
|
||||
如果你声明了某个移动函数,编译器就不再生成另一个移动函数。这与复制函数的生成规则不太一样:两个复制函数是独立的,声明一个不会影响另一个的默认生成。这条规则的背后原因是,如果你声明了某个移动函数,就表明这个类型的移动操作不再是“逐一移动成员变量”的语义,即你不需要编译器默认生成的移动函数的语义,因此编译器也不会为你生成另一个移动函数
|
||||
|
||||
再进一步,如果一个类显式声明了拷贝操作,编译器就不会生成移动操作。这种限制的解释是如果声明拷贝操作就暗示着默认逐成员拷贝操作不适用于该类,编译器会明白如果默认拷贝不适用于该类,移动操作也可能是不适用的。
|
||||
|
||||
这是另一个方向。声明移动操作使得编译器不会生成拷贝操作。(编译器通过给这些函数加上delete来保证,参见Item11)。比较,如果逐成员移动对该类来说不合适,也没有理由指望逐成员考吧操作是合适的。听起来会破坏C++98的某些代码,因为C++11中拷贝操作可用的条件比C++98更受限,但事实并非如此。C++98的代码没有移动操作,因为C++98中没有移动对象这种概念。只有一种方法能让老代码使用用户声明的移动操作,那就是使用C++11标准然后添加这些操作, 并在享受这些操作带来的好处同时接受C++11特殊成员函数生成规则的限制。
|
||||
@ -115,4 +117,4 @@ class Widget {
|
||||
记住:
|
||||
+ 特殊成员函数是编译器可能自动生成的函数:默认构造,析构,拷贝操作,移动操作
|
||||
+ 移动操作仅当类没有显式声明移动操作,拷贝操作,析构时才自动生成
|
||||
+ 拷贝构造仅当类没有显式声明拷贝构造时才自动生成,并且如果用户声明了移动操作,拷贝构造就是delete。拷贝赋值运算符仅当类没有显式声明拷贝赋值运算符时才自动生成,并且如果用户声明了移动操作,拷贝赋值运算符就是delete。当用户声明了析构函数,拷贝操作不再自动生成
|
||||
+ 拷贝构造仅当类没有显式声明拷贝构造时才自动生成,并且如果用户声明了移动操作,拷贝构造就是delete。拷贝赋值运算符仅当类没有显式声明拷贝赋值运算符时才自动生成,并且如果用户声明了移动操作,拷贝赋值运算符就是delete。当用户声明了析构函数,拷贝操作不再自动生成
|
||||
|
Loading…
Reference in New Issue
Block a user