左辺値と右辺値

オブジェクト は、検査して、保管に使 用できるストレージの領域です。 左辺値 は、そのようなオブジェクトを参照する式です。 左辺値は、それが指定するオブジェクトの変更を必ずしも許可するわけではありま せん。 例えば、const オブジェクトは、変更できない左辺値です。 変更可能な左辺値 という用語は、その左辺値は、指定された オブジェクトを検査するだけでなく、変更できることを強調するために使用されます。 次のオブジェクト・タイプは左辺値ですが、変更可能な左辺値ではありません。 これらの左辺値は変更可能ではないため、代入ステートメントの左辺に置くことはできません。

用語右辺値 は、メモ リー内のいずれかのアドレスに保管されるデータ値のことです。 右辺値は、それに代入する値を持つことができない式です。リテラル定数および変数は両方とも、右辺値として使用できます。 右辺値を必要とするコンテキストで左辺値が現れると、左辺値は暗黙的に右辺値に 変換されます。 しかし、その逆は行われません。つまり、右辺値は左辺値に変換されません。 右辺値は常に、完全型または void 型を持っています。

C のみ C では、関数指定子 が関数型を持つ式として定義されます。関数指定子は、オブジェクト型または左辺値とは異なります。関数指定子は関数の名前、または関数ポインターを間接参照した結果を使 用できます。 C 言語でも、その関数ポインターとオブジェクト・ポインターの処理を区別しています。

C++ 一方 C++ では、参照を戻す関数呼び出しは左辺値です。それ以外の場合、関数呼び出しは右辺値式です。C++ では、式はすべて左辺値または右辺値を生成するか、値をまったく生成しません。

C および C++ の両方において、演算子の中には、それらの一部のオペランドとして左辺値を必要 とするものがあります。下表は、そのような演算子と、その使い方に対する追加制限を掲載しています。
演算子 要件
& (単項) オペランドは、左辺値でなければなりません。
++ -- オペランドは、左辺値でなければなりません。 これは、接頭部と接尾部の両方の形式に適用されます。
= += -= *= %= <<= >>= &= ^= |= 左方オペランドは左辺値である必要があります。

例えば、すべての代入演算子は、それらの右方オペランドを評価し、その値を左方オペランドに代入します。 左方オペランドは、変更可能な左辺値、または変更可能なオブジェクトへの参照である必要があります。

アドレス演算子 (&) には、オペランドとして左辺値が必要です。 一方、増分演算子 (++) と減分演算子 (--) には、修正可能な 左辺値がオペランドとして必要です。 以下の例に、式と、その対応する左辺値を示します。
左辺値
x = 42 x
*ptr = newvalue *ptr
a++ a
C++ int& f() f() への関数呼び出し
関連情報