สาเหตุที่ใช้[&this]ไม่ได้เนื่องจากเป็นข้อผิดพลาดทางไวยากรณ์ แต่ละพารามิเตอร์คั่นด้วยลูกน้ำในlambda-introducerคือ a capture:
capture:
identifier
& identifier
this
คุณจะเห็นว่า&thisไม่อนุญาตให้ใช้ในเชิงไวยากรณ์ เหตุผลที่ไม่อนุญาตเนื่องจากคุณไม่ต้องการจับภาพthisโดยการอ้างอิงเนื่องจากเป็นตัวชี้ const ขนาดเล็ก คุณแค่อยากจะส่งผ่านค่ามันเท่านั้นดังนั้นภาษาจึงไม่รองรับการจับthisโดยการอ้างอิง
ในการจับภาพthisอย่างชัดเจนคุณสามารถใช้[this]เป็นไฟล์lambda-introducer.
สิ่งแรกcaptureสามารถเป็นcapture-defaultซึ่งคือ:
capture-default:
&
=
ซึ่งหมายถึงการจับภาพสิ่งที่ฉันใช้โดยอัตโนมัติโดยการอ้างอิง ( &) หรือตามค่า ( =) ตามลำดับ - อย่างไรก็ตามการรักษาthisเป็นแบบพิเศษในทั้งสองกรณีจะถูกจับโดยค่าด้วยเหตุผลที่ให้ไว้ก่อนหน้านี้ (แม้จะมีการจับค่าเริ่มต้น&ซึ่งโดยปกติจะหมายถึง จับโดยการอ้างอิง)
5.1.2.7/8:
สำหรับวัตถุประสงค์ในการค้นหาชื่อ (3.4) การกำหนดประเภทและค่าของthis(9.3.2) และการแปลง id- นิพจน์ที่อ้างถึงสมาชิกคลาสที่ไม่คงที่เป็นนิพจน์การเข้าถึงสมาชิกคลาสโดยใช้(*this)(9.3.1), คำสั่งประกอบ [OF THE LAMBDA] ได้รับการพิจารณาในบริบทของแลมด้า - นิพจน์
ดังนั้นแลมบ์ดาจึงทำหน้าที่ราวกับว่ามันเป็นส่วนหนึ่งของฟังก์ชันสมาชิกที่ปิดล้อมเมื่อใช้ชื่อสมาชิก (เช่นในตัวอย่างของคุณการใช้ชื่อx) ดังนั้นมันจะสร้าง "การใช้โดยนัย" thisเหมือนกับที่ฟังก์ชันสมาชิกทำ
ถ้าแลมบ์ดาจับรวมถึงการจับภาพเริ่มต้นที่เป็นตัวระบุในแลมบ์ดาจับต้องไม่นำหน้าด้วย& &ถ้าแลมบ์ดาจับรวมถึงการจับภาพเริ่มต้นที่เป็น=ที่แลมบ์ดาจับต้องไม่ประกอบด้วย
และแต่ละตัวบ่งชี้จะมีจะนำหน้าด้วยthis &ตัวระบุหรือthisจะต้องไม่ปรากฏมากกว่าหนึ่งครั้งในการจับแลมบ์ดา
ดังนั้นคุณสามารถใช้[this], [&], [=]หรือ[&,this]เป็นlambda-introducerที่จะจับthisตัวชี้โดยค่า
อย่างไรก็ตาม[&this]และ[=, this]มีรูปร่างไม่ดี ในกรณีสุดท้าย gcc จะเตือนอย่างไม่น่าให้อภัยสำหรับ[=,this]สิ่งนั้นexplicit by-copy capture of ‘this’ redundant with by-copy capture defaultมากกว่าข้อผิดพลาด
thisไม่สามารถเปลี่ยนแปลงได้ก็ไม่มากพอที่จะทำให้การอ้างอิงได้เร็วขึ้น ... และอยู่แล้ว , มันไม่ได้มีอยู่จริงจึงมี ไม่มีชีวิตจริงหมายถึงการอ้างอิงใด ๆ ที่จะห้อยตามคำจำกัดความthisเป็น prvalue ไม่ใช่ lvalue