c ++ 14 memperkenalkan lambda generik yang memungkinkan untuk menulis sebagai berikut:
auto func = [](auto a, auto b){
return a + b;
};
auto Foo = func(2, 5);
auto Bar = func("hello", "world");
Sangat jelas bahwa lambda generik ini func
bekerja seperti fungsi templated yang func
akan bekerja.
Mengapa komite C ++ memutuskan untuk menambahkan sintaks template untuk lamda generik?
c++
c++14
c++20
generic-lambda
coder3101
sumber
sumber
Jawaban:
Lambda generik C ++ 14 adalah cara yang sangat keren untuk menghasilkan functor dengan
operator ()
tampilan seperti ini:Tapi tidak seperti ini:
Juga tidak seperti ini:
Juga tidak seperti ini (meskipun ini agak sulit untuk benar-benar digunakan):
C ++ 14 lambda baik-baik saja, tetapi C ++ 20 memungkinkan kita mengimplementasikan kasus ini tanpa kerumitan.
sumber
(auto a, decltype(a) b)
C ++ 14.b
itu tidak terdeduksi, dan argumennya akan secara implisit diubah menjadi tipea
sebagai gantinya.Karena Anda dapat menggunakan lambda kerangka di C ++ 20, Anda dapat membatasi tipe Anda dengan cara yang lebih mudah daripada ekspresi SFINAE:
Lambda ini hanya akan bekerja dengan jenis vektor.
sumber
consteval
terkait dengan sintaks baru? Itu keren dan semuanya, tapi saya tidak mengerti relevansinya.The Proposal yang diterima ke C ++ 20 memiliki bagian motivasi yang panjang, dengan contoh-contoh. Premisnya adalah ini:
Berikut ini adalah beberapa contoh.
sumber
(sumber: iterasi waktu kompilasi dengan C ++ 20 lambda )
Hal menarik lainnya yang dapat dilakukan pada lambda generik C ++ 14 dan C ++ 17 adalah secara langsung memanggil
operator()
dengan meneruskan parameter template secara eksplisit:C ++ 14:
C ++ 20:
Contoh C ++ 14 di atas cukup tidak berguna: tidak ada cara untuk merujuk ke tipe yang disediakan
operator()
di dalam tubuh lambda tanpa memberi nama dan menggunakan argumendecltype
. Selain itu, kami terpaksa memberikan argumen meskipun kami mungkin tidak membutuhkannya.Contoh C ++ 20 menunjukkan bagaimana T mudah diakses dalam isi lambda dan bahwa lambda nullary sekarang dapat dibuatkan template secara sewenang-wenang. Ini akan sangat berguna untuk implementasi konstruksi waktu kompilasi yang disebutkan sebelumnya
sumber