C ++ 20 memungkinkan penggunaan auto
untuk tipe parameter fungsi.
Apakah itu juga memungkinkan penggunaan auto
sebagai placeholder argumen templat (tidak serupa, tetapi dalam semangat C ++ 17 templat <auto> dengan cara) untuk tipe parameter fungsi?
Jadi kode berikut, pra C ++ 20:
template<typename First, typename Second>
void printPair(const std::pair<First, Second>& p) {
std::cout << p.first << ", " << p.second;
}
Dapat ditulis sebagai:
void printPair(const std::pair<auto, auto>& p) {
std::cout << p.first << ", " << p.second;
}
Itu mengkompilasi dan bekerja dengan baik dengan implementasi GCC eksperimental untuk konsep.
Apakah ini sintaks yang sah dengan C ++ 20?
auto
langsung diterjemahkan menjadi templatisedtypename XYZ
, yang akan sangat menyiratkan bahwa itu adalah sintaks yang sah. Rapi .auto
diperbolehkan[](const std::pair<auto, auto>& p){}
(apakah dengan-std=c++2a
atau-std=c++17
).Jawaban:
Sintaks ini valid dalam Spesifikasi Teknis Konsep C ++, tetapi tidak dalam C ++ 20. Dalam konsep C ++ 20,
auto
hanya diizinkan di tingkat atas dalam tipe parameter fungsi. Aturan yang relevan adalah [dcl.spec.auto] paragraf 2 :(Jika Anda memeriksa kata-kata dalam draft kerja terbaru pada saat penulisan, Anda akan menemukan aturan yang agak berbeda. Aturan di atas telah dimodifikasi oleh isu inti 2447 , yang terpilih ke dalam draft akhir C ++ 20 di Praha rapat komite seminggu yang lalu.)
The decl-specifier s dalam fungsi parameter adalah urutan awal kata kunci dan nama jenis pada awal deklarasi parameter. Aturan di atas memungkinkan
auto
ada di tingkat atas:... tetapi hanya sebagai penentu-pernyataan .
auto
tidak diizinkan ketika bersarang di dalam specifier-pernyataan :... dan juga tidak diizinkan di tempat lain dalam tipe parameter:
sumber
auto
untuk tipe trailing return dihitung sebagai jenisauto
penggunaan ini.