Bagaimana lambda generik bekerja ( auto
kata kunci sebagai tipe argumen) dalam standar C ++ 14?
Apakah ini didasarkan pada template C ++ di mana untuk setiap kompilator tipe argumen yang berbeda menghasilkan fungsi baru dengan isi yang sama tetapi tipe yang diganti (polimorfisme waktu kompilasi) atau lebih mirip dengan generik Java (penghapusan tipe)?
Contoh kode:
auto glambda = [](auto a) { return a; };
Jawaban:
Lambda generik diperkenalkan di
C++14
.Sederhananya, tipe closure yang ditentukan oleh ekspresi lambda akan memiliki operator panggilan templated daripada operator panggilan non-template reguler dari lambda
C++11
(tentu saja, ketikaauto
muncul setidaknya sekali dalam daftar parameter).Jadi contoh Anda:
Akan membuat
glambda
contoh jenis ini:Paragraf 5.1.2 / 5 dari C ++ 14 Standard Draft n3690 menentukan bagaimana operator panggilan dari tipe closure dari ekspresi lambda yang diberikan didefinisikan:
Akhirnya:
Seperti yang dijelaskan paragraf di atas, lambda generik hanyalah gula sintaksis untuk fungsi unik dan tidak bernama dengan operator panggilan templated. Itu harus menjawab pertanyaan Anda :)
sumber
int main () { struct X {}; std::vector<X> x; }
)Sayangnya , mereka bukan bagian dari C ++ 11 ( http://ideone.com/NsqYuq ):
Dengan g ++ 4.7:
Namun , cara penerapannya di C ++ 14 sesuai dengan proposal Portland untuk lambda generik :
Ini akan menghasilkan sebagian besar pembuatan biasa dari kelas functor anonim, tetapi dengan ketiadaan tipe kompilator akan memancarkan anggota bertemplat-
operator()
:Atau sesuai proposal yang lebih baru Proposal for Generic (Polymorphic) Lambda Expressions
Jadi ya, untuk setiap permutasi parameter, sebuah instansiasi baru akan muncul, namun, anggota dari functor itu akan tetap dibagikan (yaitu argumen yang ditangkap).
sumber
-std=c++1y
.auto
memiliki aturan pemotongan yang sama dengan mobil klasik? Jika kita mengacu pada analogi templated, itu berarti auto bukan auto, itu adalah aturan yang sama dengan pengurangan jenis template. Lalu pertanyaannya adalah: apakah pemotongan template setara denganauto
?static
atauregister
:) Bagaimanapun, ya, menggunakan diauto
sana berarti bahwa di balik kap mesin, template normal dibuat. Faktanya, lambda akan diganti compiler-internal oleh sebuah kelas functor, dan sebuahauto
parameter berarti yangtemplate <T> ... (T ...)
akan dikeluarkan.Ini adalah fitur C ++ 14 yang diusulkan (tidak dalam C ++ 11) yang mirip (atau bahkan setara) dengan template. Misalnya, N3559 memberikan contoh ini:
sumber