2012-01-12 31 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'轉換參數1至'int &&'

它是正常的,我不能將一個左值綁定到右值引用?

編輯:

的功能相同的事情:

void f(int && v) 
{ 

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

我是一個有點困惑,因爲我認爲的std ::前鋒是有用的檢測,如果一個方法被調用了左值或右值引用。 但似乎我們不能綁定任何左值到右值引用......至少沒有模板參數,但我不明白它很好

+4

是的,這是正常的。參考摺疊規則只適用於構造函數本身是模板的情況。 – ildjarn 2012-01-12 19:48:41

+0

@ildjarn:謝謝,你知道這個的原因嗎? – Guillaume07 2012-01-12 19:54:18

+2

如果引用合攏規則總是應用於右值引用語法而不考慮上下文,那麼就不可能具體表示真正的右值引用,這將不會非常有用。 – ildjarn 2012-01-12 19:55:58

回答

2

調用移動構造函數需要一個r值是正常的,而不是一個l值,因爲l值可以在移動構造函數運行後命名,並且使用移動後的值會喚起意外的行爲。