Di C ++ 11, ada dua sintaks untuk deklarasi fungsi:
deklarasi-argumen pengenal tipe-balik (
... )
dan
auto
pengenal (
argumen-deklarasi ... )
->
return_type
Mereka setara. Sekarang jika mereka setara, mengapa Anda ingin menggunakan yang terakhir? Nah, C ++ 11 memperkenalkan hal keren ini decltype
yang memungkinkan Anda mendeskripsikan tipe ekspresi. Jadi Anda mungkin ingin mendapatkan tipe kembalian dari tipe argumen. Jadi Anda mencoba:
template <typename T1, typename T2>
decltype(a + b) compose(T1 a, T2 b);
dan kompilator akan memberi tahu Anda bahwa ia tidak tahu apa a
dan yang b
ada di dalam decltype
argumen. Itu karena mereka hanya dideklarasikan oleh daftar argumen.
Anda dapat dengan mudah mengatasi masalah dengan menggunakan declval
dan parameter template yang telah dideklarasikan. Suka:
template <typename T1, typename T2>
decltype(std::declval<T1>() + std::declval<T2>())
compose(T1 a, T2 b);
kecuali itu menjadi sangat bertele-tele sekarang. Jadi sintaks deklarasi alternatif telah diusulkan dan diimplementasikan dan sekarang Anda dapat menulis
template <typename T1, typename T2>
auto compose(T1 a, T2 b) -> decltype(a + b);
dan tidak terlalu bertele-tele dan aturan pelingkupan tidak perlu diubah.
Pembaruan C ++ 14: C ++ 14 juga mengizinkan
auto
pengenal (
argumen-deklarasi ... )
selama fungsinya didefinisikan sepenuhnya sebelum digunakan dan semua return
pernyataan menyimpulkan jenis yang sama. The ->
sintaks tetap berguna untuk fungsi publik (dideklarasikan di header) jika Anda ingin menyembunyikan tubuh dalam file sumber. Agak jelas itu tidak dapat dilakukan dengan templat, tetapi ada beberapa jenis konkret (biasanya diturunkan melalui metaprogramming templat) yang sulit untuk ditulis sebaliknya.