2012-01-12 8 views
2
#include<iostream> 

template<class T> 
struct Foo 
{ 
    T v_; 

    Foo(T&& v):v_(std::forward<T>(v)) 
    { 
     std::cout << "building Foo..\n"; 
    } 
}; 


int main() 
{ 
    int v; 
    Foo<int> foo(v); 

    std::cin.ignore(); 
} 

のVisual C++ 2010の出力:下右辺値参照に左辺値を結合MSVS2010

エラーC2664:'Foo<T>::Foo(T &&)'は:'int &&'

'int'からパラメータ1を変換することはできませんが、それは正常なことですI左辺値を右辺値参照にバインドできませんか?

EDIT:関数の

同じこと:

void f(int && v) 
{ 

} 
int v; 
f(v); //won't compile 

私はSTDだと思うので、私は少し混乱しています::前方には、メソッドを使用して呼び出された場合に検出することが便利です左辺値または右辺値リファレンス。 しかし、左辺値を右辺値の参照にバインドすることはできないようです...少なくともテンプレートパラメータはありませんが、わかりません。

+4

はい、正常です。参照崩壊ルールは、コンストラクタ自体がテンプレートの場合にのみ適用されます。 – ildjarn

+0

@ildjarn:ありがとう、その理由を知っていますか? – Guillaume07

+2

コンテキストに関係なく常にrvalue-reference構文に参照縮退規則が適用されている場合は、本当に有用ではない真のrvalue-referenceを具体的に示すことはできません。 – ildjarn

答えて

2

移動コンストラクタを呼び出すにはr値が必要ですl値は、移動コンストラクターが実行された後にl値が指定される可能性があり、移動元の値を使用すると意図しない振る舞いを引き起こすためです。

関連する問題