Apa arti [=] dalam C ++?


93

Saya ingin tahu apa [=]? Berikut contoh singkatnya

template <typename T>
std::function<T (T)> makeConverter(T factor, T offset) {
    return [=] (T input) -> T { return (offset + input) * factor; };
}

auto milesToKm = makeConverter(1.60936, 0.0);

Bagaimana kode tersebut bekerja, []bukan [=]?

Saya berasumsi bahwa

std::function<T (T)>

berarti prototipe fungsi yang (T)dijadikan argumen dan tipe kembalian T?


4
Ini secara aneh sangat dipilih untuk sesuatu yang tampaknya menanyakan 3 pertanyaan berbeda yang belum diteliti dan merupakan duplikat dari Apa ekspresi lambda di C ++ 11?
underscore_d

Saya setuju dengan @underscore_d - Sepertinya beberapa klik meningkatkan peringkat, bukan? :)
BitTickler

Jawaban:


108

Yang [=]Anda maksud adalah bagian dari daftar tangkapan untuk ekspresi lambda. Ini memberi tahu C ++ bahwa kode di dalam ekspresi lambda diinisialisasi sehingga lambda mendapatkan salinan dari semua variabel lokal yang digunakannya saat dibuat. Ini diperlukan agar ekspresi lambda dapat merujuk ke factordan offset, yang merupakan variabel lokal di dalam fungsi.

Jika Anda mengganti [=]dengan [], Anda akan mendapatkan kesalahan kompiler karena kode di dalam ekspresi lambda tidak akan tahu apa variabel offsetdan factorrujukannya. Banyak kompiler memberikan pesan kesalahan diagnostik yang baik jika Anda melakukan ini, jadi cobalah dan lihat apa yang terjadi!


13
"Ini perlu" - opsi tepat ini tidak perlu; kita juga bisa menulis [&], [=offset, =input]dll.
MM

1
@MM - Bukankah itu merujuk pada penduduk setempat?
berguna

5
@MM Menggunakan tangkapan referensi di sini akan menjadi masalah karena masa pakai variabel lokal tersebut akan berakhir segera setelah lambda dikembalikan. Anda benar bahwa kami dapat membuat daftar variabel individual satu per satu.
templatetypedef

45

Ini daftar tangkapan lambda . Membuat variabel tersedia untuk lambda. Anda dapat menggunakan [=]salinan mana berdasarkan nilai, atau [&]yang lewat dengan referensi.


3
Anda juga dapat menggunakan []yang tidak menangkap apa pun. :)
Daniel Kamil Kozar
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.