สาเหตุที่ใช้[&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