C++03 では、式はrvalueまたはlvalue のいずれかです。
C++11 では、式は次のようになります。
- 右辺値
- 左辺値
- x値
- gl値
- prvalue
2 つのカテゴリが 5 つのカテゴリになりました。
- これらの新しい表現のカテゴリとは何でしょうか?
- これらの新しいカテゴリは、既存の rvalue カテゴリと lvalue カテゴリとどのように関連していますか?
- C++0x の rvalue と lvalue のカテゴリは C++03 と同じですか?
- なぜこれらの新しいカテゴリーが必要なのでしょうか?WG21神々はただ我々凡人を混乱させようとしているのでしょうか?
ベストアンサー1
この文書はそれほど短くない紹介として役立つと思います:3055 円
この大虐殺は、移動セマンティクスから始まりました。移動できてコピーできない表現ができたら、突然、理解しやすいルールによって、移動できる表現とその方向を区別する必要が生じました。
ドラフトに基づいて推測するに、r/l 値の区別は同じままですが、移動のコンテキストでは物事が複雑になります。
それらは必要でしょうか? 新しい機能を放棄したいのであれば、おそらく必要ないでしょう。しかし、より優れた最適化を可能にするためには、おそらくそれらを受け入れるべきです。
引用3055 円:
- lvalue (歴史的には、lvalue は代入式の左側に出現する可能性があるため、このように呼ばれています) は、関数またはオブジェクトを指定します。[例:
E
がポインター型の式である場合、 は、*E
が指すオブジェクトまたは関数を参照する lvalue 式ですE
。別の例として、戻り値の型が lvalue 参照である関数を呼び出した結果は lvalue です。] - xvalue (「期限切れ」の値) も、通常は寿命の終わりに近づいているオブジェクトを参照します (たとえば、リソースを移動できるように)。xvalue は、rvalue 参照を含む特定の種類の式の結果です。[例: 戻り値の型が rvalue 参照である関数を呼び出した結果は xvalue です。]
- glvalue (「一般化された」lvalue)は、lvalueまたはxvalueです。
- rvalue (歴史的には、rvalue は代入式の右側に出現する可能性があるため、このように呼ばれています) は、xvalue、一時オブジェクトまたはそのサブオブジェクト、またはオブジェクトに関連付けられていない値です。
- prvalue (「純粋な」右辺値)は、 xvalueではない右辺値です。[例: 戻り値の型が参照ではない関数を呼び出した結果はprvalueです]
問題の文書は、新しい命名法の導入の結果として標準に生じた正確な変更を示しているため、この質問に対する優れた参考資料となります。