Saya menemukan kode berikut:
template <typename T, typename T1> auto compose(T a, T1 b) -> decltype(a + b) {
return a+b;
}
Ada satu hal yang tidak dapat saya mengerti:
Di mana saya bisa mengetahui apa yang dimaksud dengan operator panah ( ->
) dalam heading fungsi? Saya kira secara logis, bahwa ->
operator menentukan jenis, yang auto
akan disimpulkan, tetapi saya ingin menjelaskannya secara langsung. Saya tidak dapat menemukan informasi apa pun.
Jawaban:
Di C ++ 11, ada dua sintaks untuk deklarasi fungsi:
deklarasi-argumen pengenal tipe-balik
(
...)
dan
auto
pengenal(
argumen-deklarasi ...)
->
return_typeMereka 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:dan kompilator akan memberi tahu Anda bahwa ia tidak tahu apa
a
dan yangb
ada di dalamdecltype
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:kecuali itu menjadi sangat bertele-tele sekarang. Jadi sintaks deklarasi alternatif telah diusulkan dan diimplementasikan dan sekarang Anda dapat menulis
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.sumber
C++14
saat saya gunakanauto
untukreturn
mengetikkan fungsi seperti itu tanpa memerlukan-> decltype(a + b)
bagian tersebut. Apakah sekarang sudah mubazir atau ada kasus lain yang masih harus digunakan? atau apakah itu ekstensi khusus kompilator?auto
, tanpa->
notasi, selama fungsi tersebut sepenuhnya ditentukan sebelum digunakan dan semuareturn
pernyataan menyimpulkan ke jenis yang sama. The->
notasi masih berguna jika Anda ingin menggunakan deduksi untuk fungsi publik sementara bersembunyi tubuh dalam file sumber.Dalam bahasa Inggris sederhana dikatakan bahwa tipe yang dikembalikan adalah tipe yang disimpulkan dari jumlah
a
danb
.sumber