4

&& に関するいくつかの論文を読んだことがあります。

void fnc_1(int&& p)
{
//...
}

void fnc(int&& r)
{
fnc_1(r);//am I suppose to/should I? call it like so:fnc_1(std::forward(r)) 
}

または「r」を渡すだけで十分ですか?

4

2 に答える 2

6

fnc_1(r)rは、型に関係なく、他の変数と同様に左辺値であるため、コンパイルされません。はい、そうです、名前付き右辺値参照は右辺値ではなく左辺値です。

fnc_1(std::forward(r))std::forwardテンプレート引数を推測しないように特別に設計されているため、コンパイルされません。

右辺値を渡すには、次のいずれかが機能します。

fnc_1(std::move(r))
fnc_1(std::forward<int&&>(r))  
fnc_1(std::forward<int>(r))  

使用std::moveは、左辺値を右辺値にキャストする慣用的な方法であるため、それを使用することをお勧めします。

于 2011-07-28T17:27:56.830 に答える
3

std::forwardテンプレートは通常、依存型用です。この質問を注意深く読んで、ここに当てはまるかどうかを確認してください。これは習得するのが難しい主題なので、正確な問題に関連する詳細で質問を更新してください(整数の右辺値参照を使用することはそれほどエキサイティングではありません...)。

あなたの質問は、右辺値参照の基本的なプロパティの理解についてだと思います。覚えておくべき経験則は次のとおりです。

  • 名前のあるものはすべて左辺値(constかどうか)です。
  • 名前のないものはすべて右辺値です。
  • &&右辺値にバインドするタイプ。

あなたが機能を持っているなら...

void foo(SomeClass&& x)
{
    // ... then here x has type SomeClass& !
}

次に、本体の中にxは名前があり、したがってl値です。本当にタイプがありSomeClass&ます。std::moveをに変換するためにSomeClass&使用する必要がありますSomeClass&&

void bar(SomeClass&& x)
{
    // Since `x` has a name here, it is a Lvalue.
    // Therefore it has type SomeClass&, what the signature doesn't indicate.

    // We thus have to explicitly turn it into a rvalue:
    foo(std::move(x));
}
于 2011-07-28T16:53:56.060 に答える