2016-12-19 18 views
1

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を変更したい場合でも何でも行うことができます。これは、あなたが言うように

+0

通話者の側には、通話の練習問題が関係しています。 rvalueが関数に渡された場合、関数の呼び出し側はそれをさらに使用すべきではありません。しかし、rvalueを受け取った関数はパラメータを通常の値として見ます。 – sameerkn

答えて

2
#include <iostream> 
using std::cout; 
using std::endl; 

template<class T> 
void my_print(T&& arg) 
{ 
    my_print_impl(std::forward<T>(arg)); 
} 
template<class T> 
void my_print_impl(T& arg) 
{ 
    cout << "lvalue reference" << endl; 
} 

template<class T> 
void my_print_impl(T&& arg) 
{ 
    cout << "rvalue reference" << endl; 
} 

int main() 
{ 
    int i = 1; 
    int & l_ref = i; 
    int && r_ref = 1; 
    my_print(l_ref);   //print lvalue reference 
    my_print(r_ref);   //print lvalue reference 
    my_print(std::move(l_ref)); //print rvalue reference 
    my_print(1);    //print rvalue reference, 1 is a true rvalue 
    system("pause"); 

    return 0; 
} 

は、R_REFは左辺値参照である...私には意味がありません、あなたはそれがあなたが右辺値参照、使用などのパラメータを渡したいreference.If右辺値として一致させるために行うべきではありませんstd::move()または関数にrvalueを渡すだけです。

関連する問題