8

このページを読んで c++11 の右辺値参照について学び始めたばかりですが、最初のページで行き詰まりました。これが私がそのページから取ったコードです。

  int& foo();
  foo() = 42; // ok, foo() is an lvalue
  int* p1 = &foo(); // ok, foo() is an lvalue

  int foobar();
  j = foobar(); // ok, foobar() is an rvalue
  int* p2 = &foobar(); // error, cannot take the address of an rvalue
  1. なぜfoo()左辺値なのですか?基本的に左辺値をfoo()返すためですか?int&
  2. なぜfoobar()右辺値なのですか? foobar()返品するからintですか?
  3. 一般に、関数が右辺値であるかどうかを気にするのはなぜですか? その記事の残りの部分を読めば、これに対する答えが得られると思います。
4

1 に答える 1

16

L 値は場所であり、R 値は保存可能な値です (つまり、割り当て可能な値: たとえば、名前空間は割り当てられません。@Maggyero の編集提案に感謝します)。

そう:

  1. foo()reference( ) を返すため、int&それ自体が左辺値になります。
  2. 正しい。を返すfoobar()ため、右辺値です。foobar()int
  3. 関数が R 値であるかどうかはあまり気にしません。私たちが興奮しているのは、R-Value 参照です。

ご指摘の記事は興味深く、フォワーディングや工場での使用は考えたことがありませんでした。私が R-Value 参照に興奮した理由は、次のような移動セマンティクスでした。

BigClass my_function (const int& val, const OtherClass & valb);

BigClass x;
x = my_function(5, other_class_instance);

その例では、x が破棄され、my_function の戻り値がコピー コンストラクターを使用して x にコピーされます。歴史的にそれを回避するには、次のように記述します。

void my_function (BigClass *ret, const int& val, const OtherClass & valb);

BigClass x;
my_function(&x, 5, other_class_instance);

つまり、my_function副作用があり、読みにくいということです。現在、C++11 では、代わりに次のように記述できます。

BigClass & my_function (const int& val, const OtherClass & valb);

BigClass x;
x = my_function(5, other_class_instance);

そして、2 番目の例と同じくらい効率的に動作させます。

于 2012-12-13T07:25:10.387 に答える