C++ Primer 5th笔记(chap 13 拷贝控制)引用限定符
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                C++ Primer 5th笔记(chap 13 拷贝控制)引用限定符
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                1. 問題
關于右值和左值引用成員函數,通常在一個對象上調用成員函數,而不管對象是一個左值還是一個右值:
string s1 = "a value",s2 = "another"; auto n = (s1 + s2).find('a');s1 + s2 = "wow";2. 定義
上面的表達式對右值進行了賦值,為了阻止這種表達,在新標準中,可以強制左側運算對象 (this) 指向的運算對象是一個左值,方法是在在參數列表后放置一個引用限定符:
class Foo { public:Foo& operator=(const Foo&)& {return *this;}Foo& retFoo() {; //返回一個引用,retFoo調用是一個左值 return *this;}Foo retVal() {; //返回一個值,retVal調用是一個右值 return Foo();} };那么
Foo i, j; //i,j是左值 i = j; retFoo() = j; //正確,retFoo()返回一個左值 retVal() = j; //錯誤,retVal()返回一個右值 i = retVal(); //正確 j= retFoo(); //正確2.1 可使用&&來強制指明"左側運算對象是一個右值"
inline void StrVec::push_back(std::string &&s) {chk_n_alloc(); // reallocates the StrVec if necessaryalloc.construct(first_free++, std::move(s)); }2.2 類似 const 限定符,引用限定符只能用于非 static 成員函數
2.3 必須同時出現在函數的聲明和定義中。
3. const和引用限定符
一個函數可以同時使用 const 和引用限定符,在此情況下,引用限定符必須跟隨在const 限定符之后:
class Foo{ public:Foo someMes() & const; //錯誤,const限定符必須在前Foo someMes() const &; //正確,const限定符必須在前 };任何不會修改數據成員的函數都應該聲明為const類型。
4. 重載
4.1 定義
引用限定符可用來區分重載版本,"&& 表示返回是一個右值"。并且可以綜合引用限定符和const 來區分一個成員函數的重載版本:
class Foo{ public:Foo sorted() &&; //可用于改變的右值Foo sorted() const &; //可用于任何類型的Foo private:vector<int> data; };//本對象是右值,因此可以原址排序 Foo Foo::sorted() && {sort(data.begin(),data.end());return *this; }//本對象是const或是一個左值,哪種情況我們都不能對其進行原址排序 Foo Foo::sorted() const & {Foo ret*(*this); //拷貝一個副本sort(ret.begin(),ret.end()); //排序副本return ret; //返回副本 } retVal.sorted(); //retVal()是一個右值,調用Foo::sorted() && retFoo.sorted(); //retFoo()是一個左值,調用Foo::sorted() const &4.2 使用限制
- 當我們定義 const 成員函數時,可以定義兩個版本,唯一的差別是一個版本有const限定,另一個沒有。
 - 引用限定函數則不一樣,如果我們定義兩個或者兩個以上具有相同名字的和相同參數列表的成員函數,就必須對所有函數都加上引用限定符,或者所有都不加:
 
總結
以上是生活随笔為你收集整理的C++ Primer 5th笔记(chap 13 拷贝控制)引用限定符的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: C++ Primer 5th笔记(cha
 - 下一篇: C++ Primer 5th笔记(cha