Pembaruan: seperti yang dijanjikan oleh kursi Inti di kutipan bawah, kodenya sekarang salah bentuk :
Jika identifier di sederhana-capture muncul sebagai deklarator-id dari parameter lambda-declarator 's parameter-deklarasi-klausul , program ini sakit-terbentuk.
Ada beberapa masalah tentang pencarian nama di lambda beberapa waktu lalu. Mereka diselesaikan oleh N2927 :
Kata-kata baru tidak lagi bergantung pada pencarian untuk memetakan ulang penggunaan entitas yang ditangkap. Ini lebih jelas menyangkal interpretasi bahwa pernyataan-majemuk lambda diproses dalam dua lewat atau bahwa nama apa pun dalam pernyataan-majemuk itu mungkin diselesaikan ke anggota tipe penutupan.
Pencarian selalu dilakukan dalam konteks ekspresi lambda , tidak pernah "setelah" transformasi ke badan fungsi anggota tipe closure. Lihat [expr.prim.lambda] / 8 :
The lambda ekspresi 's senyawa-pernyataan menghasilkan fungsi tubuh ([dcl.fct.def]) dari operator fungsi panggilan, tetapi untuk tujuan nama lookup, [...], yang senyawa-pernyataan dianggap dalam konteks yang lambda ekspresi . [ Contoh :
struct S1 {
int x, y;
int operator()(int);
void f() {
[=]()->int {
return operator()(this->x+y); // equivalent to: S1::operator()(this->x+(*this).y)
// and this has type S1*
};
}
};
- contoh akhir ]
(Contoh ini juga memperjelas bahwa pencarian entah bagaimana tidak mempertimbangkan anggota penangkapan yang dihasilkan dari tipe penutupan.)
Nama foo
tidak (kembali) dideklarasikan dalam penangkapan; itu dideklarasikan di blok yang menyertakan ekspresi lambda. Parameter foo
dideklarasikan dalam blok yang bertumpuk di blok luar itu (lihat [basic.scope.block] / 2 , yang juga secara eksplisit menyebutkan parameter lambda). Urutan pencarian jelas dari blok dalam ke blok luar . Karenanya parameter harus dipilih, yaitu, Clang benar.
Jika Anda adalah untuk membuat penangkapan init-capture, yaitu foo = ""
bukan foo
, jawabannya tidak akan jelas. Ini karena penangkapan sekarang benar-benar memicu deklarasi yang "blok" tidak diberikan. Saya mengirim pesan ke kursi inti tentang ini, yang menjawab
Ini adalah masalah 2211 (daftar masalah baru akan segera muncul di situs open-std.org, sayangnya hanya dengan placeholder untuk sejumlah masalah, yang salah satunya; Saya bekerja keras untuk mengisi celah tersebut sebelum Kona pertemuan di akhir bulan). CWG membahas hal ini selama telekonferensi Januari kami, dan arahannya adalah membuat program menjadi tidak bagus jika nama penangkap juga merupakan nama parameter.