c++成員函數聲明()後加&或&&表示什麼?
今天隨便翻了翻標準,看到函數重載那裡就遇到看不懂的了,以前從沒見過。望見多識廣的多多指教。
---------c++11標準p306。
要回答這個問題,首先要解釋什麼lvalue,什麼是rvalue。
lvalue是c++中的object,它可以出現在xx==xxx 等號的左邊,也可以出現在等號的右邊rvalue是c++ statement結束後會被銷毀的東西,比如int a=1;
int b=0;
int c=3;
a=b+c;
此處
b+c
將在此statement執行完後銷毀。
rvalue不能放在等號的左邊,所以b+c=a;
是錯誤的。
解釋完什麼是lvalue 什麼是rvalue 接下來我們解釋什麼是 什麼是。
是c++里的左值引用,是c++里的右值引用。
是我們習以為常的東西,就不展開說了。舉下面一個例子解釋#include &
#include &
using namespace std;
int main()
{
string s = string("h") + "e" + "ll" + "o";
cout &<&< s &<&< endl;
}
在C++98 年代,也就是沒有之前,
string的operator+定義是這樣的:string operator+ (const string lhs, const string rhs);
在c++11,也就是說有了之後 變成了這樣
string operator+ (string lhs, string rhs);
上述兩個標準的區別在於,c++98時,使用下述語句時
string s = string("h") + "e" + "ll" + "o";
編譯器將不得不重新分配內存空間放置因operator+形成的臨時對象,因為編譯器不能直接在原string的基礎上追加+號後的string,這會導致+號前的string的值將會被改變。
string a="zhihu";
string b="magicWorld";
string c= a+b;
在第三行執行完後,你肯定不希望a的值變成"zhihumagicWorld",對吧。
而使用c++11時,編譯器知道這是一個右值引用,那麼它將可以直接在原string基礎上追加+號後的sting,而且這樣的做法並不會對原string產生任何影響。因為如前所述,右值會在statement執行完後被銷毀。
所以右值引用的一個好處在於,減少開銷。
有了以上知識儲備,再回答這個問題就容易多了。在此引用校友的解釋,因為他的解釋我並不能超越。
表示這個函數只對this對象被調用的時候在外部是左值引用或者右值引用的時候有效,可以用來做奇怪的重載。
--vczh
表示這個函數只對this對象被調用的時候在外部是左值引用或者右值引用的時候有效,可以用來做奇怪的重載。
只允許左值/右值類型調用。詳見《Effective Modern C++》Item 12有提到。後面有一章專門講左值,右值,右值引用,通用引用的,可能也會提到,不過我還沒看到那裡。( 逃
右值會調用 左值就是另一個 , 右值怎麼來std::move(申明了兩個函數的對象)
推薦閱讀:
※用傳統毛筆顏料宣紙畫水墨畫和用PS數位板畫水墨畫,哪個更有價值?
※腦電波的研究目前是什麼現狀?
※為什麼在手機指紋識別日益普遍的今天,絕大多數筆記本電腦沒有指紋識別?
※Evernote 真那麼出色嗎?