2012-10-31 72 views
6

可能重複:
What is 「->」 after function declaration?使用 - >函數聲明

我剛剛遇到的使用新auto關鍵字C++函數下面的例子,我希望有人可以幫助我理解語法的含義。

template <class T, class U> 
auto add(T t, U u) -> decltype(t + u); 

auto f = [](int a, int b) -> int { 
    return a*b; 
}; 

具體而言,我感到困惑的->在函數簽名的用戶,我期望這些被寫在作爲

template <class T, class U> 
auto add(T t, U u) 
{ 
    decltype(t + u); 
} 

auto f = [](int a, int b){ 
    return a*b; 
}; 

什麼是->運營商在那裏做什麼,在哪裏我可以學習更多關於這個語法嗎?

回答

13

->運營商在那裏做什麼?

這是一個追蹤返回類型。相反的:

int f(); 

可以等效寫:

auto f() -> int; 

如果返回類型取決於函數參數類型,那麼你需要使用這種形式;該參數不可用,直到他們已經被宣佈後:

decltype(t+u) add(T t, U u); // Error: uses `t` and `u` before they're declared 
auto add(T t, U u) -> decltype(t + u); // OK 

另外,如果要指定一個lambda的返回類型,則必須使用這種形式;雖然,正如你所指出的,在很多情況下(包括這一個),你根本不需要指定。

2

此語法(所謂尾返回型)可以使用表達式作爲返回類型,如下面的一種解決方法:

template <class T, class U> 
    decltype(t + u) add(T t, U u) { ... } 

...不會在C++正確。

不得不說這個問題在Wiki解釋得不錯(我想)。

+1

...這是不正確的,因爲它在範圍之前使用't'和'u'(它們只在參數列表中聲明)。 –

0

函數聲明中的 - >運算符指定返回「auto」函數的返回類型。它在C++ 11標準的第8章中定義。

3

[dcl.spec.auto]/2說明了如何編寫函數聲明具有自動返回類型:

自動類型說明符可以用具有尾返回型的函數聲明符出現(8.3 .5)在這種聲明有效的任何情況下。

然後在[dcl。fct]/12,有一個註釋:

當函數的返回類型很複雜時,typedefs和trailing-return-types有時很方便。例如,上面的功能fpif可能已宣佈

typedef int IFUNC(int); 
IFUNC* fpif(int); 

auto fpif(int)->int(*)(int) 

尾隨收益型是一種類型,這將是更加複雜的聲明符-ID前指定最有用:

template <class T, class U> auto add(T t, U u) -> decltype(t + u); 

而不是

template <class T, class U> decltype((*(T*)0) + (*(U*)0)) add(T t, U u); 
1

->追蹤返回類型

C++ 11提出了一種替代函數聲明語法。 auto關鍵字取代了通常的函數返回類型,實際返回類型位於->之後。

例如,

auto f (int a, int b) -> int; 

相當於

int f(int a, int b); 

這個特徵對於在返回類型必須從模板參數推導出的模板函數最有用的。

例如,

template <class T, class U> 
auto add(T t, U u) -> decltype(t + u); 

返回類型將是表達(t+u)的類型。

1

有什麼 - >運營商那裏做,我在哪裏可以瞭解這個語法的更多 ?

關於這個cprogramming有一個很好的解釋。

使用 - >(在你的情況下)或自動,decltype的本質是方便,讓你更專注於編程邏輯。

追溯返回類型( - >)可以幫助您在函數聲明本身中包含返回類型信息。

在您的備選例子的情況下:

auto add(T t, U u) 
{ 
    decltype(t + u); 
} 

如果該功能是相當複雜的,那麼這將是你的程序的讀者相當困難的(沒有明顯的明顯)弄清楚什麼預期收益類型是。