3

C++ の知識を深め、Rvalue の参照を説明する優れた記事を見つけましたhttp://blogs.msdn.com/b/vcblog/archive/2009/02/03/rvalue-references-c-0x-features-in-vc10-part -2.aspx (2009 年に発行された、やや古い記事です)。

記事には、エラーになるはずの行がいくつかあります

// original
   string&& i = modifiable_lvalue;         // Line 26

    string&& j = const_lvalue;              // Line 27 - ERROR

    string&& k = modifiable_rvalue();       // Line 28

    string&& l = const_rvalue();            // Line 29 - ERROR

ただし、Visual Studio 2012string&& i = modifiable_lvalue; // Line 26 - ERRORでもエラーが発生します!!!

エラー C2440: '初期化中': 'std::string' から 'std::string &&' に変換できません

記事によると

変更可能な右辺値参照、 Type&& は、変更可能な左辺値と変更可能な右辺値にバインドすることをいとわない

26行目で正確に発生するはずだったのはどれですか。では、なぜエラーが発生するのですか??
ありがとう !

編集: このトピックに関する非常に興味深い記事が見つかりました: http://web.archive.org/web/20120529225102/http://cpp-next.com/archive/2009/09/move-it-with-rvalue-references /#fn:insertionsort . 将来の読者は役に立つかもしれません。

4

2 に答える 2

8

記事は間違っています。右辺値参照は左辺値にバインドできません。現在、テンプレート引数で同様のことを可能にする参照折りたたみの概念 (ここでは適用されません) があります。

template <typename T>
void f(T&& x);

引数xは左辺値または右辺値のいずれかにバインドできますが、左辺値にバインドする場合、それは右辺値参照ではなく、推定される型TU&であり、2 つの参照U& &&は左辺値参照のみに折りたたまれるため、引数は次の型になります。U&(右辺値参照は削除されます)。これは通常、ユニバーサル リファレンスと呼ばれます。

繰り返しますが、これは記事から引用したコードには当てはまりません。これは正しくありません。

この記事は 2009 年に書かれたものであり、当時の標準ドラフトには記事で説明されている動作が含まれている可能性があることに注意してください。現在の標準が最終的に受け入れられた 2009 年から 2011 年にかけて、いくつかの変更がありました。

于 2013-08-28T19:36:13.970 に答える
2

記事が間違っています。static_cast<std::string&&>std::move() を使用して、またはより慣用的に、明示的に右辺値参照に変換する必要があります。

std::string&& i = std::move( modifiable_lvalue );

このコードは、コンパイラ (およびリーダー!) に、modifiable_lvalue.

于 2013-08-28T19:36:03.747 に答える