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 真那麼出色嗎?

TAG:編程 | 計算機 | C | C標準 |