下面** 看出右值引用 跟左值引用的相似之處,都具有別名的左右,可以與它引用的變數共同修改位址內的內容
左值/右值引用可以延長臨時變數的壽命,直到該右值引用的壽命結束才析構
右值引用可以直接引用臨時變數(如常量 1 ,3.1等),且可以對它進行修改(不指定const)
左值引用一般不會用於引用臨時變數,雖然通過一些手段可以編譯成功,但不安全也沒有意義
struct reftest
~reftest()
std::string&& getrvalue_ref() &&
std::string& getlvalue_ref()
std::string str;
};void test1()
對於函式的返回值如果是臨時變數(函式內建的變數,既不是引數變數也不是類成員變數),不能返回引用!
對c++ 在編譯的時候會對返回值進行優化,如果返回的是臨時變數(注意不是引用!),則會直接使用該臨時變數的位址,不會進行內容的遷移和內參的釋放,因此效率比較高。這也說明返回值處一般不需要使用move來強制轉換右值,多此一舉。
int getrvalue()
int& getlvalue_ref()
struct rvaluetest
~rvaluetest()
int value = 2;
char * const str;
std::string cstr;
};rvaluetest&& getrvalue_ref()
rvaluetest getrvalue_test()
void reftest()
深入理解( )左值引用和( )右值引用
左值是指既能出現在等號左邊也能出現在等號右邊的變數 或表示式 右值則只能出現在等號右邊 返回左值引用的函式,連同賦值 下標 解引用和前置遞增 遞減運算子,都是返回左值的表示式 返回非引用型別 右值引用的函式,連同算術 關係 位以及後置遞增 遞減運算子,都返回右值的表示式 左值持久,右值短暫,左值有持...
c 左值 右值 右值引用 左值引用
c 裡一切值必須屬於左值 右值兩者之一。左值 一切變數 包括用const修飾的變數 物件 包括引用都屬於左值 右值 一切字面值 可以是巨集 臨時無名物件 函式返回值 表示式 如a n 說明一下 函式返回值,返回的是某乙個型別的值,並不是返回變數。左值並不是說能放在 左邊的值就是左值 雖然用const...
c 左值 右值 左值引用 右值引用
在c語言中,左值認為是賦值語句的左側,右值認為是賦值語句的右側。在c 中,意義稍有不同。c 中,每乙個表示式會產生乙個左值或者右值,相應的,該表示式也就被稱作 左值表示式 右值表示式 乙個左值表示式的求值結果是乙個物件或者是乙個函式。左值可以當右值使用,而右值不能當左值使用。c prime 中這麼簡...