![](/img/trans.png)
[英]c++ lambda capture the context by reference and also the `this` pointer
[英]this pointer in lambda-capture by reference
struct CL
{
int i;
void fnc()
{
[&this](){i=1;}; // (1) error
[&](){i=1;}; // (2) ok
}
};
這是第一種情況,不起作用,但是第二種情況。 這是為什么?
我看到標准5.1.2 / 1:
捕獲:
識別碼
和標識符
這個
(即&this不存在)
和5.1.2 / 15:
如果實體是隱式或顯式捕獲的,但不是通過副本捕獲的,則通過引用捕獲該實體
在第二種情況下,根據5.1.2 / 14,“ this”未被復制捕獲:
如果一個實體是隱式捕獲的,並且捕獲默認值為=,或者使用不包含&的捕獲顯式捕獲, 則通過副本捕獲該實體
但是,如何才能通過值顯式捕獲“ this”指針呢? 還是只能使用default-capture &隱式地進行?
形式上, [&]
確實抓住this
參照,每5.1.2 / 16“的實體通過引用捕獲 ,如果它隱含或明確地捕獲但不通過復制捕獲。” 但這沒關系,因為
5.1.2 / 18 ...如果
this
被捕獲,每個ODR使用的this
被轉換成到閉合型,流延(5.4)到的類型的相應的未命名數據成員的訪問this
。 [注意:強制類型轉換確保轉換后的表達式是prvalue。 —尾注]
因此,對於this
,捕獲通過復制和捕獲通過引用是無法區分的。 對於所有的實際目的, this
總是被復制抓獲。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.