10

C++(11)でR値const intないのはなぜですか? R値は左辺にあることができない「何でも」であり、定数はそれを満たすと思いました。このコードは失敗します:

int f(int && x) { return 100; }

void g() {
  const int x = 1;
  f(x);
}

error: invalid initialization of reference of type ‘int&&’ from expression
of type ‘const int’
4

4 に答える 4

12

OK、式1には 3 つのカテゴリがあります。

  1. ID を持ち、移動できないオブジェクトを表すもの。
  2. ID を持ち、移動できるオブジェクトを表すもの。
  3. ID を持たず、移動できるオブジェクトを表すもの。

最初のものは左辺値、2 番目のものは xvalue、3 番目のものは prvalue と呼ばれます。lvalues と xvalues を一緒にすると、glvalues になります。Glvalue はすべて、ID を持つオブジェクトを表す式です。xvalues と prvalues を一緒にすると、rvalues になります。右辺値は、移動可能なオブジェクトを表すすべての式です。

問題の式 はxglvalue です: と書くことができる&xので、オブジェクトは明らかに同一性を持っています。

この表現から移動できますか?このオブジェクトはまもなく期限切れになりますか? いいえそうではありません。現在の式の後でのみ有効期限が切れます。つまり、移動することはできません。それは左辺値になります。

C++ の左辺値と右辺値は、元の C での意味を意味しなくなったため、これらの名前はすべて少し混乱する可能性があります。C++ の意味は、割り当て2の左側または右側にあることとはまったく関係ありません。

個人的には、 Bjarne によるこの論文の用語を使用することを好みます。および m 値 (右辺値の代わり)。残念ながら、これは標準が使用する用語ではありません。


1ここで「アイデンティティを持つ」とは、「そのアドレスを取得できる」ことを意味します。「から移動できる」とは、一時的な性質のため、またはプログラマーが呼び出しなどによって型システムで明示的に作成したために、有効期限が近づいていることを意味しますstd::move

2代入の左側に右辺値を持つことができます:std::vector<int>(17) = std::vector<int>(42)たとえ役に立たなくても、有効な式です。

于 2012-12-05T13:58:59.770 に答える
6

R値は[代入演算の]左辺にありえない「なんでも」だと思っていた

それは の C++03 定義でありrvalue、それでも口語表現であり、普遍的に真実ではありません。

C++11 では、 と の定義が若干変更されていますlvaluervalueルールは複雑で、標準では個々の状況がケースバイケースで処理されますが、一般的な経験則は次のとおりです。

  1. 何かのアドレスを取得できる場合、それはlvalue
  2. 式の型がlvalue参照の場合、その式はlvalue
  3. 上記のいずれにも該当しない場合は、rvalue

特定のケースでは、のアドレスを取得できますx(たとえば、「名前があります」)。したがって、それは左辺値です。

C++11 の左辺値と右辺値については、次の 2 つの優れた記事で詳しく読むことができます。

于 2012-12-05T14:04:36.963 に答える
1

パラメーターの型は右辺値参照であり、標準では、「参照関連」型の左辺値を使用した右辺値参照の初期化を禁止しています。

8.5.3 参照 [dcl.init.ref]

...

5 ... T1 が T2 に参照関連であり、参照が右辺値参照である場合、初期化子式は左辺値であってはなりません。

したがって、以下はエラーです。

void f (long &&);

const long x = 1;
void g () { f (x); }

しかし、以下はそうではありません:

void f (long &&);

const int x = 1;
void g () { f (x); }

したがって、エラーの理由は単に「初期化に右辺値が使用されていない」ということではなく、「初期化に参照関連型の左辺値が使用されている」ためです。

于 2012-12-05T13:56:13.787 に答える
0

簡単に言えば、右辺値の値を「盗む」ことができるはずです。これが、右辺値のさまざまな扱いの要点です。したがって、右辺値は、名前のない近い将来に死ぬはずです。

于 2012-12-05T14:01:46.403 に答える