日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

右值引用(C++11)

作者:DayDay upup 更新時間: 2022-09-22 編程語言

文章目錄

    • 什么是左值?
    • 什么是右值?
    • 左值引用與右值引用比較
    • 右值引用使用場景和意義

什么是左值?

左值是一個表示數據的表達式(如變量名或解引用的指針),我們可以獲取它的地址+可以對它賦
值,左值可以出現賦值符號的左邊,右值不能出現在賦值符號左邊
。定義時const修飾符后的左
值,不能給他賦值,但是可以取它的地址。左值引用就是給左值的引用,給左值取別名。

int main()
{
	// 以下的p、b、c、*p都是左值

	int* p = new int(0);
	int b = 1;
	const int c = 2;

	// 以下幾個是對上面左值的左值引用

	int*& rp = p;
	int& rb = b;
	const int& rc = c;
	int& pvalue = *p;

	return 0;
}

什么是右值?

右值也是一個表示數據的表達式,如:字面常量、表達式返回值,函數返回值(這個不能是左值引
用返回)等等,右值可以出現在賦值符號的右邊,但是不能出現出現在賦值符號的左邊,右值不能
取地址。右值引用就是對右值的引用,給右值取別名。

double fmin(double x, double y)
{
	return  x < y ? x : y;
}


int main()
{
	double x = 1.1, y = 2.2;

	// 以下幾個都是常見的右值

	10;
	x + y;
	fmin(x, y);

	// 以下幾個都是對右值的右值引用

	int&& rr1 = 10;
	double&& rr2 = x + y;
	double&& rr3 = fmin(x, y);

	// 這里編譯會報錯:error C2106: “=”: 左操作數必須為左值

	10 = 1;
	x + y = 1;
	fmin(x, y) = 1;

	return 0;
}

總結:

右值相較于左值的特點:不能被取地址

左值引用與右值引用比較

左值引用總結

  1. 左值引用只能引用左值,不能引用右值。
  2. 但是const左值引用既可引用左值,也可引用右值。
int main()
{
	// 左值引用只能引用左值,不能引用右值。

	int a = 10;
	int& ra1 = a; // ra為a的別名

	int& ra2 = 10; // 編譯失敗,因為10是右值
	// const左值引用既可引用左值,也可引用右值。

	const int& ra3 = 10;
	const int& ra4 = a;
	return 0;
}

右值引用總結

  1. 右值引用只能右值,不能引用左值。
  2. 但是右值引用可以move以后的左值。
int main()
{
	// 右值引用只能右值,不能引用左值。

	int&& r1 = 10;

	int a = 10;
	int&& r2 = a;// message : 無法將左值綁定到右值引用
	// 右值引用可以引用move以后的左值
	int&& r3 = std::move(a);
	return 0;
}

右值引用使用場景和意義

在這里插入圖片描述
這種方式會造成資源的浪費:str等to_string調用完畢后生命周期結束,會調用析構函數,釋放空間
如果能夠將str所指向的空間直接給ret1,就不會造成資源的浪費,這就是右值引用的意義

// 移動構造
 string(string&& s)
 :_str(nullptr)
 ,_size(0)
 ,_capacity(0)
 {
 swap(s);
 }

如果string提供了上述函數,再次調用to_string時,就會發生移動構造
在這里插入圖片描述

原文鏈接:https://blog.csdn.net/zjq_love/article/details/126978649

欄目分類
最近更新