Baru-baru ini saya menemukan potongan kode esoterik berikut.
int main(){(([](){})());}
Format ulang sebagai berikut untuk membuatnya lebih mudah dibaca:
int main(){
(([](){})()); // Um... what?!?!
}
Tapi saya tidak bisa mengerti bagaimana (([](){})())
kode yang valid.
- Itu tidak terlihat seperti sintaks fungsi pointer.
- Tidak mungkin ada trik kelebihan operator. Kode mengkompilasi apa adanya.
Google tidak banyak membantu dengan pencarian semua simbol ini. Tapi itu dikompilasi dalam Visual Studio 2010 dan tidak menghasilkan apa-apa. Tidak ada kesalahan, dan tidak ada peringatan. Jadi sepertinya kode yang valid.
Aku belum pernah melihat kode yang valid yang begitu aneh di luar Javascript dan C fungsi pointer .
Bisakah seseorang menjelaskan bagaimana ini valid C ++?
Don't sweat it. We have int main(){(([](){})());} which is valid C++"
(9 Nov dalam obrolan)Jawaban:
Kode dasarnya memanggil lambda kosong.
Mari kita mulai dari awal:
[](){}
adalah ekspresi lambda kosong .Kemudian, dalam C dan C ++, Anda dapat membungkus ekspresi dalam parens dan mereka berperilaku persis sama † seolah-olah ditulis tanpa mereka, jadi itulah yang dilakukan sepasang parens pertama di sekitar lambda. Kami sekarang di
([](){})
.Kemudian,
()
setelah orangtua pembungkus pertama memanggil lambda (kosong). Kami sekarang di([](){})()
Seluruh ekspresi dibungkus dalam parens lagi dan kita dapatkan
(([](){})())
.Akhirnya,
;
akhiri pernyataan itu. Kami tiba di(([](){})());
.† Ada beberapa kasus sudut setidaknya dalam C ++, seperti
T a_var;
ada perbedaan antaradecltype(a_var)
dandecltype((a_var))
.sumber
B foo(A())
foo adalah fungsi (mengambil pointer berfungsi sebagai hanya parameter dan mengembalikan B) sedangkan diB foo((A()))
foo adalah objek B dibangun memohon pengambilan konstruktor a A object (instance mana yang bersifat anonim sementara dalam kasus ini).