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?

der_lord
sumber
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!

templatetypedef
sumber
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.

kometen
sumber
3
Anda juga dapat menggunakan []yang tidak menangkap apa pun. :)
Daniel Kamil Kozar