此指针在 lambda 捕获(按引用)中

this pointer in lambda-capture by reference

本文关键字:引用 捕获 指针 lambda      更新时间:2023-10-16
struct CL
{
    int i;
    void fnc()
    {
        [&this](){i=1;};  // (1) error
        [&](){i=1;};      // (2) ok
    }
};

这是第一种情况不起作用,但第二种情况起作用。为什么?
我看到标准 5.1.2/1:

捕获:
标识符
和标识符

(即 &这不存在)

和 5.1.2/15:

如果实体是隐式或显式的,则通过引用捕获该实体 捕获但未通过副本捕获

在第二种情况下,"this"不会根据 5.1.2/14 被复制捕获:

如果实体被隐式捕获,并且 捕获默认值为 = 或者如果它被捕获显式捕获 不包括 &

但是如何按值显式捕获"此"指针呢?或者是否只能隐式地使用默认捕获和?

从形式上讲,[&]确实通过引用捕获this,根据 5.1.2/16"如果一个实体被隐式或显式捕获但未被复制捕获,则通过引用捕获实体。但这并不重要,因为

5.1.2/18 ...如果捕获this,则this的每个 odr 使用都将转换为对闭包类型的相应未命名数据成员的访问,将 (5.4) 转换为 this 类型。[注意:强制转换确保转换后的表达式是 prvalue。

所以对于this,按拷贝捕获和按引用捕获是无法区分的。出于所有实际目的,this始终通过副本捕获。