foo & =operator(foo rhs)
在這裏,如果 = 運算符的右側對象是左值,那麼由於會向 rhs 傳遞對象,那麼會調用拷貝構造函數構造 rhs ,如果右側對象是右值,那麼會調用移動構造函數。
2:一當一個類定義了任何一個拷貝操作,就應該定義所有的五個操作(拷貝構造,拷貝賦值,移動構造,移動賦值,析構)
3:在調用
std:move(value)
之後,value 的值是未定義的,但是卻又是有效的,爲了保障程序不出問題,我們必須保證 執行該函數後,value 不能被訪問(取值)。
4:移動迭代器
iter1 = make_move_iterator(iter)
利用這個函數可以把一個迭代器改成移動迭代器,就是把 iter 指向的內存元素變成可以移動的,對 iter1 解引用就可以得到類似 move(value)的操作。可以移動 *iter1 元素。但是我們必須保證移動後,我們不能訪問
*iter ,因爲原來元素移動後的值未定義,但卻是有效的,如果訪問會使得程序出問題。
5:建議不要隨便使用移動操作,因爲有一個移動後的元素他的狀態具有不確定性,調用 std::move 一定要保證移動後的源不能被訪問。
6:const T & 和 T &&
一般成員函數的參數是 const T & ,一般爲左值,爲了保證被複製對象的安全性,不用 T &,參數類型時 T && ,參數一般是右值引用,一般是爲了竊取數據,是需要修改竊取後的數據的,不用
const T &&。
7:左值和右值引用成員函數
我們可以像 用 const 一樣來用 & 和 && 來修飾一個 this 指針可以指向一個左值或者右值。引用限定符只能用於非 static 成員函數,引用限定符可以和 const 一起用,但是必須在
const 後面。
8:用 & 修飾的函數只能用於左值, && 修飾的函數只能用於右值。
9:引用限定符也是可以像 const 一樣,可以區分重載函數。有無引用限定符是可以區分函數的類型。但是類似於成員函數參數的 const T& 和 T&& 一樣,類型限定符可以爲 const & 和 && ,前面一種可以用於任何對象,後面一種只可以用於右值類型。
10:如果一個類中有兩個或者以上名字、參數、都相同的成員函數,那麼這些函數中只要有一個函數有引用限定符說明,那麼所有的其他同名同參數的函數都需要有,對於同名但是不同參數的則沒有該要求。
11:foo(*this) 是一種 無主 的右值,foo 是類名。