左と右の値
これは、(読み取り専用)変数の数のために、我々は彼らの値を変更せずにその値を読み、使用する変数であり、変数の残りのために、私たちだけでなく、それらの値を読み取ります、時には彼らは非常に一般的である、その値(読み取りと書き込み)を変更します。C ++では、前者の変数が呼び出された正しい値、後者の変数が呼び出され、左の値、例えば:
int a = 1; // a是左值,1是右值
左と右の値のC ++
わずかに異なる点は、C ++で、変数の値は、左または右の値であるということです我々はそれを使用する方法に依存しない、それが唯一のC ++標準で定義された方法のその種類や世代によって決定されます。(変数値の左右の変数の値が下記の標準C ++「左値」で指定を参照し、「正しい値」)
C ++では、私たちは、読み取りと書き込みの変数の値が残って、私たちは(2つだけ例外は後述します)右の値の値を変更しない(というだけで「いいえ」より)ことができます。あなたは正しい値サイトを取得することはできません(この例外は存在しません)。
C ++左辺値の式と右の値式で
式は、変数の値を表す場合、C ++では」という表現を入れた後、左の左辺値表現『;式は右の変数の値を表す場合、この式を』として正しい値表現。 "
例えば、関数が参照型を返す場合、この変数の値が(正しい値)を残っている場合、関数呼び出し式は、戻り値を変数「基準」を示す、関数呼び出し式の戻り値を、式は、関数呼び出しであります左の値(r値)の発現、機能は別の型を返す場合、関数呼び出し式は、匿名の一時変数の指標であるが、この変数は無名関数の戻り値を格納するために使用され、これは正しい値、関数呼び出し匿名変数であります式は、右の式の値です。
C ++、右辺値参照に残され、一定値
実際の状況のほとんどに沿って、C ++標準の規定が、例えば、数値リテラル(1,2,3,3.56,7が...)右の値として定義されており、実際に単一の人が番号を変更したいと思う1値が、一部省略が残っています。
あなたは慎重に見ると、時々、私たちはいくつかの値の値を変更する権利をしたいが、時には彼らは、左の一部が値を持っていたいとあなたを見つける変更することはできません。このような状況に対処するには、C ++標準では、2つの例外を導入しました。前者のために、我々は後者のために右の値を参照して値を変更する権利を評価することができ、我々は左一定の値を使用することができます。
左一定の値のconst修飾子でこの変数を宣言変数の値を変更することはできませんし、初期化後に初期化する必要があります、コードを見てみましょう。
const int a = 10; // 声明了常量左值a,初始化为10
a = 15; // 非法,试图通过赋值改变常量左值a的值
右辺値参照はによって示されるように、「参照」の正しい値で左值引用
も変数の正しい値の値を変更することができる右辺値参照によって、左側の値として変数の値を変更することができます。
- 変数名の前に追加&宣言により、左基準値、&&の文が先行変数名で右基準値。
- それはあなたが単一のステートメントで複数の参照を定義することができますが、それぞれの参照名&または&&の前に追加する必要があります。
- リファレンスを初期化する必要があります。(私の他の記事を参照してください:参照先初期化)
- 参照は、オブジェクトではないので、参照への参照が存在しない、いかなるポインタ参照が存在しません。
コードを見てください:
#include <iostream>
class A
{
public:
int value = 10;
};
A test();
int main()
{
A instance; // 类A的一个实例变量
A &&a = test() , &b = instance; /* 定义一个A类型的右值引用a
绑定到test()的返回值,定
义一个A类型的左值引用b绑
定到实例变量instance*/
a.value = 15;
std::cout << a.value << std::endl << b.value << std::endl;
return 0;
}
A test()
{
A a;
return a;
}
結果:
15
10