2014-05-11 21 views
2

我想知道這是可能的嗎?傳遞一個左值給RValue的參數

template<typename T> 
void Test(T&& arg) 
{ 
    arg = 14; 
} 


int a = 23; 
Test(a); 

我的問題是,功能測試需要類型右值的參數但是這似乎也接受類型左值的參數。這是爲什麼 ?那是因爲模板的存在嗎?因爲如果我做這樣的事情

void AnotherTest(int&& arg) 
{ 
    arg = 14; 
} 

然後該函數要求參數是類型Rvalue。 如果有人能解釋爲什麼模板的存在會改變行爲,我將不勝感激。

+3

查找「參考摺疊」和「通用參考」。 – juanchopanza

+0

'T &&'不是一個右值引用(而'int &&'是)。根據參數表達式的值類別,它將*推導*爲rvalue-或lvalue-reference。 Scott Meyers [稱之爲](https://isocpp.org/blog/2012/11/universal-references-in-c11-scott-meyers)*通用參考*。 – jrok

+0

@jrok:大概,但並非真正正確。模板參數*推導*,而不是模板函數參數。參數的類型將會是推導類型的一個* rvalue-reference *,最終可能是* lvalue-reference *參數。 –

回答

1

的關鍵,因爲你正確想象,就在於它是一個模板的參數類型是推導。當你調用Test與左值,因爲參數類型推演規則時的說法是一個右值引用將演繹類型T是一個左值參考,因而專業化變爲:

template <> 
void Test<int&>(int & && arg) 

此時塌陷規則基準踢和參數的類型變成:

template <> 
void Test<int&>(int & arg) 

雖然模板需要一個右值參考,如果類型是左值參考參數變成左值參考本身。