อัปเดต: ตามที่สัญญาไว้โดยเก้าอี้หลักในใบเสนอราคาด้านล่างตอนนี้รหัสมีรูปแบบไม่ถูกต้อง :
หากมีการระบุในที่ง่ายต่อการจับภาพปรากฏเป็นdeclarator-IDของพารามิเตอร์ที่แลมบ์ดา-declarator 's พารามิเตอร์ประกาศข้อโปรแกรมจะไม่ดีเกิดขึ้น
มีปัญหาเล็กน้อยเกี่ยวกับการค้นหาชื่อใน lambdas เมื่อไม่นานมานี้ พวกเขาได้รับการแก้ไขโดยN2927 :
ถ้อยคำใหม่ไม่ได้อาศัยการค้นหาเพื่อทำการแมปการใช้เอนทิตีที่ถูกจับอีกต่อไป เป็นการปฏิเสธการตีความที่ชัดเจนยิ่งขึ้นว่าคำสั่งผสมของแลมบ์ดาถูกประมวลผลในสองรอบหรือชื่อใด ๆ ในคำสั่งผสมนั้นอาจเปลี่ยนเป็นสมาชิกของประเภทการปิด
การค้นหาจะทำในบริบทของแลมบ์ดา - นิพจน์เสมอไม่ "หลังจาก" การเปลี่ยนแปลงไปยังเนื้อหาฟังก์ชันของสมาชิกประเภทการปิด ดู[expr.prim.lambda] / 8 :
แลมบ์ดาแสดงออกของสารประกอบงบผลผลิตฟังก์ชั่นของร่างกาย ([dcl.fct.def]) ของผู้ประกอบการฟังก์ชั่นการโทร แต่สำหรับวัตถุประสงค์ของการค้นหาชื่อ [ ... ] ที่ผสมคำสั่งมีการพิจารณาในบริบทของแลมบ์ดาแสดงออก [ ตัวอย่าง :
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*
};
}
};
- ตัวอย่างตอนท้าย ]
(ตัวอย่างยังทำให้ชัดเจนว่าการค้นหาไม่ได้พิจารณาสมาชิกการดักจับที่สร้างขึ้นของประเภทการปิด)
ชื่อfoo
ไม่ได้ (อีกครั้ง) ประกาศในการจับภาพ; มันถูกประกาศในบล็อกที่มีนิพจน์แลมบ์ดา พารามิเตอร์foo
ถูกประกาศในบล็อกที่ซ้อนอยู่ในบล็อกด้านนอกนั้น (ดู[basic.scope.block] / 2ซึ่งกล่าวถึงพารามิเตอร์แลมบ์ดาอย่างชัดเจนด้วย) ลำดับของการค้นหาเป็นอย่างชัดเจนจากภายในบล็อกนอก ดังนั้นควรเลือกพารามิเตอร์นั่นคือเสียงดังถูกต้อง
หากคุณทำการจับภาพแบบเริ่มต้นเช่นfoo = ""
แทนที่จะfoo
เป็นคำตอบจะไม่ชัดเจน เนื่องจากการจับในขณะนี้ทำให้เกิดการประกาศที่ไม่ได้รับ "บล็อก" ฉันส่งข้อความถึงเก้าอี้แกนกลางเรื่องนี้ใครตอบกลับ
นี่คือปัญหา 2211 (รายการปัญหาใหม่จะปรากฏบนไซต์ open-std.org ในไม่ช้าน่าเสียดายที่มีเพียงตัวยึดตำแหน่งสำหรับปัญหาหลายประการซึ่งเป็นปัญหาหนึ่งฉันกำลังทำงานอย่างเต็มที่เพื่อเติมเต็มช่องว่างเหล่านั้นก่อนที่ Kona ประชุมสิ้นเดือน) CWG พูดถึงเรื่องนี้ในระหว่างการประชุมทางไกลในเดือนมกราคมของเราและทิศทางคือทำให้โปรแกรมมีรูปแบบไม่ถูกต้องหากชื่อการจับภาพเป็นชื่อพารามิเตอร์ด้วย