2014-03-19 59 views
54

,我發現這樣的代碼:箭頭操作符 - 函數標題(>)

template <typename T, typename T1> auto compose(T a, T1 b) -> decltype(a + b) { 
    return a+b; 
} 

,我和所有的細節,這是新的給我,但一想通。 請告訴我,我在哪裏可以閱讀,箭頭運算符(->)在函數標題中的含義是什麼? 我想純粹邏輯上,->運營商確定一個類型,這將得到auto,但我想弄明白,但無法找到信息。

+2

它是尾隨返回類型語法的一部分。請參閱http://stackoverflow.com/a/4113390/962089 – chris

+1

它不是運算符,而是語法的一部分。 – texasbruce

+0

在回答「我可以在哪裏閱讀?」時,C++規範是最權威的。缺乏資金或願望花費$$,最後的工作草案通常足夠接近和免費。這些規格非常專業,因此對閱讀ISO規格缺乏熟悉度,請嘗試cplusplus.com或cppreference.com或其他此類不具權威性的網站,但通常非常準確。注意:從C++ 14開始,尾隨返回類型可以省略。 – Les

回答

86

在C++ 11中,有兩個用於語法函數聲明:

        返回型標識符(參數-聲明...)

        auto標識(說法,聲明...)-> return_type

他們是等價的。現在,當他們相當時,你爲什麼要使用後者?那麼,C++ 11介紹了這個很酷的decltype的東西,可以讓你描述一個表達式的類型。所以你可能想從參數類型派生返回類型。所以,你試試:

template <typename T1, typename T2> 
decltype(a + b) compose(T1 a, T2 b); 

,編譯器會告訴你,它不知道什麼ab都在decltype說法。那是因爲它們只是由參數列表聲明的。

通過使用declval和已經聲明的模板參數,您可以輕鬆解決問題。像:

template <typename T1, typename T2> 
decltype(std::declval<T1>() + std::declval<T2>()) 
compose(T1 a, T2 b); 

除了它現在變得非常冗長。所以備用聲明語法提出並實現了,現在你可以寫

template <typename T1, typename T2> 
auto compose(T1 a, T2 b) -> decltype(a + b); 

,它的更簡潔和範圍的規則並不需要改變。


C++ 14更新: C++ 14還允許只是

        auto標識符(參數-聲明...)

只要功能在使用前全部定義並且所有return陳述推斷爲相同類型。如果要隱藏源文件中的正文,->語法對於公用函數(在頭文件中聲明)仍然有用。有些顯然不能用模板完成,但是有一些具體的類型(通常是通過模板元編程獲得的),否則很難寫。

+0

非常好,整潔而翔實的回覆@Jan Hudec。表示讚許,滿意,勝利。在'C++ 14'中有什麼改變,因爲我在''decltype(a + b)''部分中使用'auto'作爲'return'類型的函數。現在它是多餘的還是還有其他情況下仍然應該使用?或者它是一個編譯器特定的擴展? – Shadi

+1

@Shadi,C++ 14包含[N3638](https://isocpp.org/files/papers/N3638.html),它允許扣除聲明爲'auto'的返回類型,而不使用' - >'表示法,只要該函數在使用前完全定義並且所有'return'語句推導爲相同的類型。如果你想在公開函數中使用演繹而隱藏源文件中的主體,' - >'表示法仍然有用。 –

12

用普通英語說明返回類型是ab之和的推斷類型。