,我發現這樣的代碼:箭頭操作符 - 函數標題(>)
template <typename T, typename T1> auto compose(T a, T1 b) -> decltype(a + b) {
return a+b;
}
,我和所有的細節,這是新的給我,但一想通。 請告訴我,我在哪裏可以閱讀,箭頭運算符(->
)在函數標題中的含義是什麼? 我想純粹邏輯上,->
運營商確定一個類型,這將得到auto
,但我想弄明白,但無法找到信息。
,我發現這樣的代碼:箭頭操作符 - 函數標題(>)
template <typename T, typename T1> auto compose(T a, T1 b) -> decltype(a + b) {
return a+b;
}
,我和所有的細節,這是新的給我,但一想通。 請告訴我,我在哪裏可以閱讀,箭頭運算符(->
)在函數標題中的含義是什麼? 我想純粹邏輯上,->
運營商確定一個類型,這將得到auto
,但我想弄明白,但無法找到信息。
在C++ 11中,有兩個用於語法函數聲明:
返回型標識符(
參數-聲明...)
和
auto
標識(
說法,聲明...)
->
return_type
他們是等價的。現在,當他們相當時,你爲什麼要使用後者?那麼,C++ 11介紹了這個很酷的decltype
的東西,可以讓你描述一個表達式的類型。所以你可能想從參數類型派生返回類型。所以,你試試:
template <typename T1, typename T2>
decltype(a + b) compose(T1 a, T2 b);
,編譯器會告訴你,它不知道什麼a
和b
都在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
陳述推斷爲相同類型。如果要隱藏源文件中的正文,->
語法對於公用函數(在頭文件中聲明)仍然有用。有些顯然不能用模板完成,但是有一些具體的類型(通常是通過模板元編程獲得的),否則很難寫。
非常好,整潔而翔實的回覆@Jan Hudec。表示讚許,滿意,勝利。在'C++ 14'中有什麼改變,因爲我在''decltype(a + b)''部分中使用'auto'作爲'return'類型的函數。現在它是多餘的還是還有其他情況下仍然應該使用?或者它是一個編譯器特定的擴展? – Shadi
@Shadi,C++ 14包含[N3638](https://isocpp.org/files/papers/N3638.html),它允許扣除聲明爲'auto'的返回類型,而不使用' - >'表示法,只要該函數在使用前完全定義並且所有'return'語句推導爲相同的類型。如果你想在公開函數中使用演繹而隱藏源文件中的主體,' - >'表示法仍然有用。 –
用普通英語說明返回類型是a
和b
之和的推斷類型。
它是尾隨返回類型語法的一部分。請參閱http://stackoverflow.com/a/4113390/962089 – chris
它不是運算符,而是語法的一部分。 – texasbruce
在回答「我可以在哪裏閱讀?」時,C++規範是最權威的。缺乏資金或願望花費$$,最後的工作草案通常足夠接近和免費。這些規格非常專業,因此對閱讀ISO規格缺乏熟悉度,請嘗試cplusplus.com或cppreference.com或其他此類不具權威性的網站,但通常非常準確。注意:從C++ 14開始,尾隨返回類型可以省略。 – Les