2

私は右辺値参照について学んでいます、そしてチュートリアルは私にこれを教えてくれました:

X foo();
X x;
x = foo();

むしろ明らかに、xと一時的なものの間でリソースポインタ(ハンドル)を交換し、一時的なもののデストラクタにxの元のリソースを破壊させることは、問題なく、はるかに効率的です。

言い換えると、代入の右側が右辺値である特別な場合では、コピー代入演算子をこのように動作させる必要があります。

それで、これは、関数からの戻り値がデフォルトで常に一定であり、それによって右辺値であることを意味しますか?はいの場合:それらは常に一定ですか、それとも例外がありますか?

4

5 に答える 5

3

それで、これは、関数からの戻り値がデフォルトで常に一定であり、それによって右辺値であることを意味しますか?はいの場合:それらは常に一定ですか、それとも例外がありますか?

cv T&いいえ。参照型(またはcv T&&)を返さない場合は、右辺値です。それらの戻りタイプがconst-qualifiedである場合、それらは一定です。

つまり、関数からの戻り値は右辺値(新しい標準X foo()が必要な場合はprvalue )であり、定数ではありません。さらに、のような表現では、通常、割り当て中に一時的に変更されてもかまいません。これは、移動セマンティクスの背後にある考え方です。x = foo()

于 2011-12-11T22:13:44.430 に答える
3

Rvalue-nessとconstant-nessは同義語ではなく、少し直交しています。次の定義で:

struct X {};
const X x;
const X f();
int X();

次の式を分類できます。

x;       // constant lvalue
f();     // constant rvalue
g();     // non-constant rvalue

あなたの特定の質問の時点で:いいえ、すべての右辺値式が一定であるとは限りません。

于 2011-12-11T22:15:11.770 に答える
1

タイプオブジェクトを混乱させる可能性があります。だけが左辺値/右辺値の概念を持っています。 foo();はタイプの右辺値ですX。そのため、ステートメントx = foo();は、可能であれば、のメンバー関数を呼び出しX::operator=(X &&)ますx。これに失敗すると、X::operator=(X const &)右辺値はconst-referencesにバインドされるため、標準にバインドされます。

理論的には、定数の右辺値を持つことが可能であることに注意してください。たとえば、関数をとして宣言した場合などですX const bar();。次に、bar()にバインドせず、 (および)X&&にのみバインドします。ただし、実際にはこれを使用することはできません。X const &&X const &

于 2011-12-11T22:14:50.197 に答える
1

この前の質問を参照してください。これは、右辺値式が暗黙的にconst型のものでも、それらが表すオブジェクトが本質的に不変にされていないことを示しています。

ただし、場合によっては、右辺値を使用してオブジェクトを変更すること定義されていません(または禁止されています—どちらかを忘れています)。これは、右辺値を介してアクセスされるオブジェクトに一種の条件付きの固有の不変性をもたらすように見えます。関数呼び出しを評価した結果は、常にではありませんが、多くの場合です。—右辺値式。

于 2011-12-11T22:15:45.290 に答える
1

§5.2.2/10(N3225)は次のように述べています。

関数呼び出しは、結果タイプが関数タイプへの左辺値参照タイプまたは右辺値参照である場合は左辺値、結果タイプがオブジェクトタイプへの右辺値参照である場合はxvalue、それ以外の場合はprvalueです。

于 2011-12-11T22:18:21.870 に答える