2012-09-14 83 views
30

在一個系統頭文件,我看到這樣的表達:函數聲明後的「 - >」是什麼?

auto create_task(_Ty _Param) -> task<typename details::_TaskTypeFromParam<_Ty>::_Type> 
{...} 

我不知道是什麼「 - >」的意思,它不是指針表達式或lambda表達式,誰能幫助我?

+4

順便說一句,對於谷歌搜索來說,術語是「追蹤返回類型」。 – chris

回答

47

這是來自C++ 11的新函數聲明語法,它被稱爲「尾隨返回類型」。在函數聲明結束時,->表示以下是該函數的返回類型。只有在使用auto關鍵字而不是您通常期望的實際返回類型時才能使用它。

舉例來說,這兩個聲明是兼容的:

int foo(); 
auto foo() -> int; 

根據你的口味,你會發現它比舊的聲明語法漂亮,尤其是當返回類型是非常長/複雜:

task<typename details::_TaskTypeFromParam<_Ty>::_Type> create_task(_Ty _Param); 
auto create_task(_Ty _Param) -> task<typename details::_TaskTypeFromParam<_Ty>::_Type>; 

但是有時可能需要使用模板,當函數的返回類型可能隨參數而變化時。

說你想要一個模板函數添加變量:

template<typename T> 
T add(const T& x, const T& y) 
{ 
    return x + y; 
} 

這是偉大的,但你只能添加相同類型的變量。假設您希望能夠添加任何類型的變量(如add((int)1, (double)2))。

template<typename T, typename U> 
??? add(const T& x, const U& y) 
{ 
    return x + y; 
} 

的問題是,你不能事先告訴x + y的結果類型將是什麼。作爲模板,它們甚至可以是非整數類型。 (難道你不能這樣做add(std::string("x"), "y")?)

Decltype,以及新的函數聲明語法,讓你解決這個問題。

template<typename T, typename U> 
auto add(const T& x, const U& y) -> decltype(x + y) 
{ 
    return x + y; 
} 

Decltype「返回」表達式的類型。由於您需要xy已宣佈爲decltype(x + y)才能正常工作,因此您需要新的語法。

+0

即使使用常規返回類型,也可以訪問參數類型,因爲模板參數始終首先聲明。你無法訪問的是參數名稱,甚至是函數名稱。 –

相關問題