2017-09-01 154 views
1

下面的代碼不能編譯,因爲T現在被推斷爲引用(l值或r值,但這裏不相關)。所以std::vector不能以T作爲論據。有誰知道一些方法來解決這個問題?謝謝!如何正確傳遞模板參數?

template<typename T> 
void func(T&& t) 
{ 
    std::vector<T> v; 
} 

答:使用std::decay的評論。

+2

請提供一個[MCVE]來產生您遇到的問題。 –

+4

使用['std :: decay'](http://en.cppreference.com/w/cpp/types/decay) – SirGuy

+0

謝謝SirGuy!有效! – Dave

回答

1

如何聲明具有推導類型的參數取決於您計劃如何使用參數。在圖示的聲明中你聲明的參數作爲轉發參考其推導取決於函數是如何被調用模板參數:

  • 如果函數被調用類型X參數的左值TX&
  • 如果函數調用類型X參數的一個rvalue TX

所得參數是INTE nded是轉發的地方,並使用

std::forward<T>(t) 

是最有可能使用的。如果你願意消耗你的論點(即參數是坑的地方),你可能擊敗了由值(即,你」把它d使用f(T t))和std::move(t)將其值轉換爲其最終目的地。您可能需要閱讀參數,但不要使用它,在這種情況下,您應該將其作爲T const&傳遞給它。

假設使用轉發參考是故意的,您應該聲明std::vector具有從推導的類型獲得的相應類型,例如,

std::vector<std::decay_t<T>> v;