OK、式1には 3 つのカテゴリがあります。
- ID を持ち、移動できないオブジェクトを表すもの。
- ID を持ち、移動できるオブジェクトを表すもの。
- ID を持たず、移動できるオブジェクトを表すもの。
最初のものは左辺値、2 番目のものは xvalue、3 番目のものは prvalue と呼ばれます。lvalues と xvalues を一緒にすると、glvalues になります。Glvalue はすべて、ID を持つオブジェクトを表す式です。xvalues と prvalues を一緒にすると、rvalues になります。右辺値は、移動可能なオブジェクトを表すすべての式です。
問題の式 はx
glvalue です: と書くことができる&x
ので、オブジェクトは明らかに同一性を持っています。
この表現から移動できますか?このオブジェクトはまもなく期限切れになりますか? いいえそうではありません。現在の式の後でのみ有効期限が切れます。つまり、移動することはできません。それは左辺値になります。
C++ の左辺値と右辺値は、元の C での意味を意味しなくなったため、これらの名前はすべて少し混乱する可能性があります。C++ の意味は、割り当て2の左側または右側にあることとはまったく関係ありません。
個人的には、 Bjarne によるこの論文の用語を使用することを好みます。および m 値 (右辺値の代わり)。残念ながら、これは標準が使用する用語ではありません。
1ここで「アイデンティティを持つ」とは、「そのアドレスを取得できる」ことを意味します。「から移動できる」とは、一時的な性質のため、またはプログラマーが呼び出しなどによって型システムで明示的に作成したために、有効期限が近づいていることを意味しますstd::move
。
2代入の左側に右辺値を持つことができます:std::vector<int>(17) = std::vector<int>(42)
たとえ役に立たなくても、有効な式です。