C++ 右值引用和左值引用

RunTimeErrors發表於2024-10-09

C++ 右值引用和左值引用

C++中所有的值必屬於左值和右值。引入右值引用主要是為了提高程式效能,避免不必要的記憶體複製,將資源無代價地轉移給另一個所有。使用右值引用可以將右值的生命週期延長至右值引用的生命週期。

左值: 傳統C++引用都是左值引用,可以被獲取地址的變數都是左值

右值: 不能被獲取地址的變數都是右值,右值又分為純右值和將亡值

純右值: 臨時變數和不被關聯的字面變數,臨時變數如一般的函式返回值

將亡值: 將要被移動的變數(移為他用),如返回值為T&&的函式,std::move()函式操作的變數,強制轉為T&&的變數

//以下均為將亡值

int&& getRightValue()
{
	//....
	return 10;
}

int ia = 10;
int &&ira = std::move(ia); // 轉移ia的記憶體所有權

int getInt()
{
	return 1;
}

int main()
{
	int ia = 10;
	const ica = 15;
	
	int& ria = ia; // 正確	左值賦值給左值引用
	const& rcia1 = ia;//正確	左值賦值給常量左值引用
	const& rcia2 = ica;//正確	常量左值賦值給左值引用
	
	int& ia2 = 10; //錯誤		右值無法賦值給左值引用
	int& ia3 = getInt();//錯誤	函式返回值為臨時變數(純右值)
	int&& ita = getInt(); //正確	純右值可以賦值給右值引用
	int&& ita2 = 10;//正確	右值可以賦值給右值引用
	int&& ita3 = std::move(ia); //正確	std::move()操作的值返回為將亡值,可以賦值給右值引用
	
    // const引用可以適配任何型別

}

右值引用的特徵

  1. 右值引用延長臨時變數的生命週期,右值的生命週期與右值引用存在的日期一致

  2. 右值引用獨立於左值和右值。意思是右值引用型別的變數可以是左值也可以是右值(不能用左值來初始化右值引用,但是以右值引用為引數的函式可以傳入左值)

  3. T&& a型別的函式引數,它的具體型別取決於它的初始化

  4. 右值不可以獲取地址,但是右值引用可以取地址,代表臨時變數的地址

相關文章