lvalueという用語は C で使用されています (C++ に引き継がれ、後で拡張されました)。そもそも右辺値はありませんでした。私が持っている草案 (N1570) には、右辺値という用語の 2 つの出現箇所がリストされています。脚注 #64 で 1 回、索引で 1 回です。
一言で言えば、C の世界では、左辺値とその他すべての 2 種類のオブジェクトがあります。
脚注は標準の一部ではありませんが、有用な洞察を提供できることに注意してください。脚注 64 を次に示します。
64) ''lvalue'' という名前は、最初は代入式 E1 = E2 に由来します。ここで、左側のオペランド E1 は (変更可能な) 左辺値である必要があります。オブジェクトの「ロケーター値」を表していると考えた方がよいでしょう。「右辺値」と呼ばれることがあるものは、この国際標準では「式の値」として記述されています。
左辺値のわかりやすい例は、オブジェクトの識別子です。さらなる例として、E がオブジェクトへのポインターである単項式である場合、*E は、E が指すオブジェクトを指定する左辺値です。
これにより、良いスタートが切れます。ここで、式はオブジェクト (および演算子ですが、後で説明します) から構築されることを覚えておいてください。オブジェクトを扱う際には、型と値という 2 つの基本的なことを考慮する必要があります。次に、型の制限について標準が何を言っているか見てみましょう (6.3.2.1/p1):
左辺値は、潜在的にオブジェクトを指定する (void 以外のオブジェクト型を持つ) 式です。64) 左辺値が評価時にオブジェクトを指定しない場合、動作は未定義です。
また、重要な次の行に注意してください。
オブジェクトが特定の型を持つと言われる場合、その型は、オブジェクトを指定するために使用される左辺値によって指定されます。
そのため、左辺値を型の代わりに使用できます (これも後で説明します)。次に、オブジェクトが左辺値であるコンテキストを見てみましょう(6.3.2.1/2):
sizeof 演算子、_Alignof 演算子、単項 & 演算子、++ 演算子、-- 演算子、または . 演算子または代入演算子
したがって、これらは注意が必要な演算子です。その他の場合:
配列型を持たない左辺値は、指定されたオブジェクトに格納されている値に変換されます (左辺値ではなくなります)。これは左辺値変換と呼ばれます。
配列と関数指示子の 2 つの特殊な型があります。これらの減衰は、つまり、配列オブジェクトの最初の要素を指し、左辺値/ 「型を返す関数へのポインター」ではない型「型へのポインター」を持つ式に変換されます。(左辺値が型として機能するという事実について一時停止したことを思い出してください。これはまさに、左辺値がandで行うことです!)sizeof
_Alignof