在一個系統頭文件,我看到這樣的表達:函數聲明後的「 - >」是什麼?
auto create_task(_Ty _Param) -> task<typename details::_TaskTypeFromParam<_Ty>::_Type>
{...}
我不知道是什麼「 - >」的意思,它不是指針表達式或lambda表達式,誰能幫助我?
在一個系統頭文件,我看到這樣的表達:函數聲明後的「 - >」是什麼?
auto create_task(_Ty _Param) -> task<typename details::_TaskTypeFromParam<_Ty>::_Type>
{...}
我不知道是什麼「 - >」的意思,它不是指針表達式或lambda表達式,誰能幫助我?
這是來自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
「返回」表達式的類型。由於您需要x
和y
已宣佈爲decltype(x + y)
才能正常工作,因此您需要新的語法。
即使使用常規返回類型,也可以訪問參數類型,因爲模板參數始終首先聲明。你無法訪問的是參數名稱,甚至是函數名稱。 –
順便說一句,對於谷歌搜索來說,術語是「追蹤返回類型」。 – chris