この状況を理解するには、転送参照が機能する理由を理解する必要があります。あなたがsome_type&
する
some_type some_object;
foo(some_object);
テンプレート控除のようなもの推論T
を書くとき
template <typename T>
void foo(T&& t) {}
のような定義を考えます。パラメータt
のタイプはsome_type& &&
です。参照への参照はできないため、reference collapsingのルールが適用され、some_type& &&
はsome_type&
に折りたたまれています。 some_type
をする
があれば、代わりに、あなたは
some_type some_object;
foo(std::move(some_object));
テンプレート控除のようなもの推論T
を書きます。パラメータt
のタイプはsome_type&&
です。これは完全に有効なタイプなので、参照の折りたたみは行われません。
今度はstd::forward
になります。 std::forward<U>
はすべて、そのパラメータをU&&
にキャストします。 U
がsome_type
の場合、上記の2番目の場合と同様に、パラメータはsome_type&&
にキャストされます。それはrvalue-referenceのままです。 U
がsome_type&
である場合、上記の最初の場合と同様に、再び参照縮退が実行され、some_type& &&
はsome_type&
になります。したがって、std::forward
は左辺値参照を返します。
元の質問に対する最終的な答えは、std::forward
の戻り値の型は、std::forward
のテンプレートパラメーターとして渡される型にのみ依存します。あなたのケースのT
は常に非参照型として推論されるため、std::forward
は常にrvalue-referenceを返します。
"* cは普遍的な/フォワーディングリファレンスではないことに注意してください*"なぜ*あなたは 'std :: forward'を使っていますか? –
私は誤って1つのアンパサンドを省略し、std :: forwardがなぜここにあるように動作するのか不思議に思っていました。 –
http://thbecker.net/articles/rvalue_references/section_08.html – hadriel