std :: forward関数の働きについてEffective Modern C++ by Scott Meyerを読んでいたときに、私がよく理解していない1つの質問がありました。C++ Lvalue参照を受け取る関数へのRvalue参照の受け渡し
template<typename T>
void foo(T&& fooParam)
{
...
someFunc(std::forward<T>(fooParam));
}
を本の中で、スコットはstd::forward<T>
は、以下の方法で実施することができることを説明しています:
template<typename T>
T&& forward(typename remove_reference<T>::type& param)
{
return static_cast<T&&>(param);
}
はfoo
に渡された引数が右辺値であると仮定し、次のように我々は機能foo
を持っている場合は言いますタイプWidget
です。そして、std::forward
関数テンプレートは次のように初期化されます:
Widget&& forward(Widget& param)
{ return static_cast<Widget&&>(param); }
だから私の質問で、fooParam
は(タイプWidget &&
である)std::forward
に渡されたとき、どのようにできたタイプWidget& param
試合fooParam
のパラメータを取る関数?私はfooParam
自体が左辺であることを知っています。しかし、そのタイプはまだ正価基準(Widget &&
)ですか?どのように彼らはお互いに一致することができる?
lvalue参照型のパラメータを受け取る関数にrvalue参照を渡すことができた場合、この関数は、(一時オブジェクトのように)渡されたrvalueを変更したい場合でも何でも行うことができます。これは、あなたが言うように
通話者の側には、通話の練習問題が関係しています。 rvalueが関数に渡された場合、関数の呼び出し側はそれをさらに使用すべきではありません。しかし、rvalueを受け取った関数はパラメータを通常の値として見ます。 – sameerkn