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 decltypeyang 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 adan yang bada di dalam decltypeargumen. Itu karena mereka hanya dideklarasikan oleh daftar argumen.
Anda dapat dengan mudah mengatasi masalah dengan menggunakan declvaldan 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 returnpernyataan 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.