[C ++] - 右辺値参照のC ++ 11白視点

右辺値参照

Benpianでは、表示されます。

  • 左の値とは何ですか?正しい値とは何ですか?
  • 左の値の参照は何ですか?右の値の参照とは何ですか?
  • モバイル構造とは何ですか?

1、左と右の値

左と右の値は、C言語の概念、C言語ですが、厳密に区別、一般的な考えを与えていない:だけで等号の右側に、等号の左側に配置することができたりと呼ばれる左辺値のアドレスを取ることができますまたは右値としてアドレスを取ることができません。しかし、必ずしも完全に正しいです。

コードの一部でみましょう初見:

int main()
{
	int a = 10;
	int b = 20;

	//a和b都是左值,b既可以在=的左侧,也可以在右侧,如下:
	a = b;
	b = a;
	//说明:左值既可以放在=的左侧,也可以放在=的右侧

	const int c = 30;
	c = a;  //编译报错,c为const 常量,只允许读不允许修改
	
	 //因为可以对c取地址,因此c严格的来说不算是左值,如下:
	cout << &c << endl;

	//编译失败,因为b+1的结果是一个临时变量,没有具体名称,不能取地址,因此为右值,如下:
	b + 1 = 20;

	
	system("pause");
	return 0;
}

あなたは左と右の値のほとんど意味を持っている場合は、こちらを参照してください?実際には、理解することができる。発現のために、自分のアドレスを取得(&)操作が成功することができた者は、値を残し、それ以外の場合は、それが正しい値であり、

一時オブジェクトが正しい値である。という注意

要約:

名前の、あなたは住所、左の値であることすべて取ることができるので1、変数の一般的なタイプ、
2を、constの修正定数は、システムのタイプ、両方を治療するために、正しい値に基づいて理論は、変更することはできませんが、それはアドレス、C +を取ることができますので、 11は、左の値であると考えてい
ますが、式の一時的な結果は、オブジェクトまたはオブジェクトで実行した場合、正しい値であると考えられ、3
式は基準値が残っていると考えられる単一の変数である場合に動作した結果、4か

図2に示すように、左右の基準値基準値

左と右の値を知ることは、私たちが左右の基準値基準値について話しましょう。私たちは、C ++ 11は、右の値を変更することができないことを知っているが、右辺値参照は、このパターンを破るように見え、それは、私たちは右の基準値を取得し、それを変更することができます。

理解するためのコードの第二の外観:

int main()
{
	int a = 10;
	//普通类型只能引用左值,不能引用右值,如下:
	int& ra1 = a;   //ral为a的别名
	//int& ra2 = 10;  //编译失败,因为10是右值

	//const引用既可以引用左值,也可以引用右值,如下:
	const int& ra3 = 10;
	const int& ra4 = a;
	system("pause");
	return 0;
}

一つの文章にまとめて:普通のタイプは左のみではなく、右基準値の値を参照することができますが、左のconst基準値のいずれかを参照することができ、それはまた、右の値を参照することができます

右辺値参照タイプがある:&&オブジェクトの=種類が変更されます。次のとおりです。

int main()
{
	//10本来是纯右值,本来是一个符号,没有具体空间
	//右值引用变量r1在定义过程中,编译器产生了一个临时变量,r1实际引用的是临时变量
	int &&r1 = 10;
	r1 = 100;

	int a = 10;
	//int&& r2 = a;  //编译失败,因为右值引用不能引用左值
	int&& r3=move(a);  //但是加上move之后可以引用左值
	return 0;
}

要約:

  • 左辺値参照と右辺値参照は、オブジェクトのエイリアスにあり
  • 左の値が通常です:オブジェクトを変更することができます
  • 右の値は、通常、次のとおりです。定数、式の戻り値
  • 左基準値は左辺値可能
  • const参照値は左右の値ことができ
  • 右の値が右の値を参照することができます
  • 右辺値参照は、左の基準値に移動することができます

3、制限がコンストラクタをコピーします

ここで私はクラステスト、テストを定義し、メイン関数内部に検査対象Tを初期化するコンストラクタを呼び出すコンストラクタをコピー(移動構造は、コピーコンストラクタの問題を解決することができるので、なぜ突然、コピーコンストラクタを言及)。
ここに画像を挿入説明
この場合には、コピーコンストラクタは、外部コールのテストクラスのコンストラクタに一度、関数の時間関数に戻り、オブジェクトが初期化されると、テスト時間t、2回呼び出され、あなたが見ることができ、説明してください。
実際には、2つの一時オブジェクトは意味がない、建設の終わりであることを、破壊され、値が滅びる、コピーコンストラクタ内の不要なコピーだったが、幸い、上記のコードでは、私はちょうど百個のint型を開きますスペースは、それが何百万または数百万の何百もある場合には、効率が低くなります。これは、いくつかの真実ようで、その後、どのように我々が何をすべき?振り返ってみると

図4に示すように、モバイルコンストラクタ

モバイル構造は、あなた(一時オブジェクト)が死んだの価値を持っているので、その後、私はそれが直接である、あなたは私にあなたのデータをゆっくりと開いた空間に不要になったをコピーします、あなたの記憶を持っていること指示していると考えられます私たち_aは、そのメモリに直接指摘上記のコードが引き継ぎ、および100の整数値を上書きコピーする前に、その後に置きます。実際には、これがあるコンストラクタを動かすというアイデア

モバイルコンストラクタに関する構成機能であるが、それは、上記の例では、その移動コンストラクタは次のように右に、このクラスのオブジェクト参照のパラメータ値を受け入れます。

Test(Test &&rhs):_a(rhs._a)
{
	rhs._a=nullptr;
}

我々は唯一の浅いコピー、_a(rhs._a)を持っていた工事のリストの初期設定では、オブジェクトは、RHSのアプリケーションのメモリフットプリントして、コピーコンストラクタを回避し、同時にRHSポインタ割り当てnullptr、でています複製効率に起因するメモリの問題。

これらは、問題があるC ++右辺値参照に関する情報、すぐに作者も奨学金、です、私は、ユーザーの大半は、特定のは、謙虚に受け入れることを示唆願っています

公開された33元の記事 ウォン称賛13 ビュー1038

おすすめ

転載: blog.csdn.net/Vicky_Cr/article/details/105107241