void f(string&& s);
之前不知道兩個&&是什麼意思,還以為是引用的引用,類似於二級指標的東西。。。。。。
後來參考了這篇文章
class a{
public:
a(){
cout<<"constructor"《明白了這個是右值引用。首先需要明確一下左值和右值的定義:
右值通過排他性定義,不是左值就是右值。
a()就是乙個右值,這是乙個臨時的a物件,但是&(a())是非法的,編譯會報錯"taking address of temporary"。這個臨時物件在記憶體中沒有位置標識,這個物件是右值物件,但是這個右值物件確實是儲存在記憶體中的,我們執行這樣一條語句:
a().p();
this指向臨時的這個a物件,確實輸出了這個臨時的a物件的位址。而且執行完這條語句後,就銷毀了這個臨時物件,輸出了destory。
其他的例如:
int a=2;
(a+2)=3;//error
a+2也是乙個右值,a+2的結果有可能只會儲存在cpu的暫存器中,不儲存在記憶體中,所以說a+2沒有記憶體的位置標識。
我們平時經常寫的這種語句:
a tmp;
a& ref=tmp;
ref其實是乙個左值引用,tmp是乙個左值,這段程式把左值引用ref和tmp繫結在一起。由於ref是左值引用,所以說:
a& ref=a()//錯誤,a()是右值
a&& ref=a()//正確,ref是右值引用
一般右值引用就是用乙個臨時物件進行操作,例如stl的map中:
//那麼我們我們可以這樣用:
mymap[a()];
//找到mymap中臨時物件對應的value,接著臨時物件就銷毀了
c 右值引用 學習筆記
僅為個人理解,個人筆記 部分 和內容引用於文章從4行 看右值引用 來自鏈結文章裡 include using namespace std int g constructcount 0 int g copyconstructcount 0 int g destructcount 0 struct a ...
c 左值 右值 右值引用 左值引用
c 裡一切值必須屬於左值 右值兩者之一。左值 一切變數 包括用const修飾的變數 物件 包括引用都屬於左值 右值 一切字面值 可以是巨集 臨時無名物件 函式返回值 表示式 如a n 說明一下 函式返回值,返回的是某乙個型別的值,並不是返回變數。左值並不是說能放在 左邊的值就是左值 雖然用const...
c 左值 右值 左值引用 右值引用
在c語言中,左值認為是賦值語句的左側,右值認為是賦值語句的右側。在c 中,意義稍有不同。c 中,每乙個表示式會產生乙個左值或者右值,相應的,該表示式也就被稱作 左值表示式 右值表示式 乙個左值表示式的求值結果是乙個物件或者是乙個函式。左值可以當右值使用,而右值不能當左值使用。c prime 中這麼簡...