Kami memiliki fungsi yang menggunakan lambda internal yang tidak menangkap sendiri, misalnya:
void foo() {
auto bar = [](int a, int b){ return a + b; }
// code using bar(x,y) a bunch of times
}
Sekarang fungsi yang diimplementasikan oleh lambda menjadi dibutuhkan di tempat lain, jadi saya akan mengangkat lambda keluar dari foo()
ruang lingkup global / namespace. Saya bisa membiarkannya sebagai lambda, menjadikannya opsi salin-tempel, atau mengubahnya ke fungsi yang benar:
auto bar = [](int a, int b){ return a + b; } // option 1
int bar(int a, int b){ return a + b; } // option 2
void foo() {
// code using bar(x,y) a bunch of times
}
Mengubahnya ke fungsi yang tepat itu sepele, tapi itu membuat saya bertanya-tanya apakah ada alasan untuk tidak meninggalkannya sebagai lambda? Apakah ada alasan untuk tidak menggunakan lambda di mana saja alih-alih fungsi global "biasa"?
Jawaban:
Ada satu alasan yang sangat penting untuk tidak menggunakan lambda global: karena itu tidak normal.
Sintaks fungsi reguler C ++ telah ada sejak zaman C. Pemrogram telah mengetahui selama beberapa dekade apa arti sintaksis dan bagaimana mereka bekerja (walaupun harus diakui bahwa keseluruhan hal peluruhan fungsi-ke-pointer terkadang menggigit bahkan programmer berpengalaman). Jika seorang programmer C ++ dari tingkat keahlian apa pun di luar "newbie mengucapkan" melihat definisi fungsi, mereka tahu apa yang mereka dapatkan.
Global lambda adalah binatang yang sama sekali berbeda. Ini memiliki perilaku yang berbeda dari fungsi biasa. Lambdas adalah objek, sedangkan fungsi tidak. Mereka memiliki tipe, tetapi tipe itu berbeda dari tipe fungsinya. Dan seterusnya.
Jadi sekarang, Anda telah meningkatkan kemampuan dalam berkomunikasi dengan programmer lain. Seorang programmer C ++ perlu memahami lambdas jika mereka akan mengerti apa fungsi ini lakukan. Dan ya, ini tahun 2019, jadi seorang programmer C ++ yang baik harus memiliki gambaran seperti apa lambda. Tapi itu masih bar yang lebih tinggi.
Dan bahkan jika mereka memahaminya, pertanyaan pada pikiran programmer itu adalah ... mengapa penulis kode ini menulis seperti itu? Dan jika Anda tidak memiliki jawaban yang baik untuk pertanyaan itu (misalnya, karena Anda secara eksplisit ingin melarang kelebihan muatan, seperti dalam poin penyesuaian Ranges), maka Anda harus menggunakan mekanisme umum.
Pilih solusi yang diharapkan daripada yang baru jika sesuai. Gunakan metode yang paling tidak rumit untuk menyampaikan maksud Anda.
sumber
Saya dapat memikirkan beberapa alasan Anda ingin menghindari lambda global sebagai pengganti drop-in untuk fungsi reguler:
"Mengapa saya tidak harus menggunakan lambdas untuk menggantikan functor (kelas) stateful?"
sumber
std::integral_constant
untuk itu ...Setelah bertanya, saya memikirkan alasan untuk tidak melakukan ini: Karena ini adalah variabel, mereka rentan terhadap Fiasco Order Inisialisasi Statis ( https://isocpp.org/wiki/faq/ctors#static-init-order ), yang dapat menyebabkan bug di telepon.
sumber
constexpr
lambda ... intinya adalah: Cukup gunakan fungsi.Masalah tingkat kompleksitas tertentu memerlukan solusi setidaknya kompleksitas yang sama. Tetapi jika ada solusi yang kurang kompleks untuk masalah yang sama, maka benar-benar tidak ada pembenaran untuk menggunakan yang lebih kompleks. Mengapa memperkenalkan kompleksitas yang tidak Anda butuhkan?
Antara lambda dan fungsi, fungsi hanyalah jenis entitas yang kurang kompleks dari keduanya. Anda tidak perlu membenarkan tidak menggunakan lambda. Anda harus membenarkan menggunakan satu. Ekspresi lambda memperkenalkan tipe penutupan, yang merupakan tipe kelas yang tidak disebutkan namanya dengan semua fungsi anggota khusus yang biasa, operator panggilan fungsi, dan, dalam hal ini, operator konversi implisit untuk penunjuk fungsi, dan membuat objek jenis itu. Copy-menginisialisasi variabel global dari ekspresi lambda hanya melakukan banyak lebih dari sekedar mendefinisikan fungsi. Ini mendefinisikan tipe kelas dengan enam fungsi yang dinyatakan secara implisit, mendefinisikan dua fungsi operator lagi, dan membuat objek. Kompiler harus melakukan lebih banyak. Jika Anda tidak membutuhkan fitur lambda, maka jangan gunakan lambda…
sumber
Lambdas adalah fungsi anonim .
Jika Anda menggunakan lambda bernama, itu berarti Anda pada dasarnya menggunakan fungsi anonim bernama. Untuk menghindari oxymoron ini, Anda sebaiknya menggunakan fungsi.
sumber
Kami dulu menggunakan fungsi alih-alih fungsi global, sehingga merusak koherensi dan Prinsip yang paling tidak mengejutkan .
Perbedaan utama adalah:
sumber