左辺値と右辺値
すべての C++ の式は左辺値または右辺値です。 左辺値は、1 つの式を超えて保持するオブジェクトを参照します。 lvalue は、名前を持つオブジェクトと考えることができます。 変更不可能な (const) 変数を含めて、すべての変数は左辺値です。 右辺値は、それを使用する式を超えて保持されない一時的な値です。 lvalues と rvalues の相違点をより詳しく理解するために、次の例について考えてみましょう。
// lvalues_and_rvalues1.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
int main()
{
int x = 3 + 4;
cout << x << endl;
}
この例では、x は、これを定義する式の外側で保持されるので、左辺値です。 式 3 + 4 は右辺値です。定義した式を超えては存在しない一時的な値と評価されるためです。
次の例は、左辺値と右辺値の正しい使用方法と間違った使用方法のいくつかを示しています。
// lvalues_and_rvalues2.cpp
int main()
{
int i, j, *p;
// Correct usage: the variable i is an lvalue.
i = 7;
// Incorrect usage: The left operand must be an lvalue (C2106).
7 = i; // C2106
j * 4 = 7; // C2106
// Correct usage: the dereferenced pointer is an lvalue.
*p = i;
const int ci = 7;
// Incorrect usage: the variable is a non-modifiable lvalue (C3892).
ci = 9; // C3892
// Correct usage: the conditional operator returns an lvalue.
((i < 3) ? i : j) = 7;
}
注意
このトピックの例では、演算子がオーバーロードしていないときの、正しい方法使用と正しくない使用方法を説明します。演算子をオーバーロードすることにより、j * 4 のような式を左辺値にできます。
オブジェクト参照を示すときに、lvalue および rvalue という用語は頻繁に使用されます。 参照の詳細については、「左辺値参照宣言子: &」および「右辺値参照宣言子: &&」を参照してください。