【问题标题】:this pointer in lambda-capture by reference通过引用在 lambda 捕获中的 this 指针
【发布时间】:2015-04-19 12:10:41
【问题描述】:
struct CL
{
    int i;
    void fnc()
    {
        [&this](){i=1;};  // (1) error
        [&](){i=1;};      // (2) ok
    }
};

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

捕获:
标识符
&标识符
这个

(即 &this 不存在)

和 5.1.2/15:

一个实体被隐式或显式引用捕获 捕获但没有被复制捕获

在第二种情况下,“this”不会根据 5.1.2/14 被副本捕获:

如果实体被隐式捕获并且 capture-default 是 = 或者如果它是通过捕获显式捕获的 不包括 &

但是我怎样才能显式地捕获“this”指针呢?还是只能隐式地使用 default-capture & ?

【问题讨论】:

  • 最后一行应该回答你的问题。 or if it is explicitly captured with a capture that does not include an &
  • 通过引用捕获this 是没有意义的——你不能修改它,或者获取它的地址。如果您愿意,可以通过 [this] 之类的值显式捕获它。
  • this 只能按值捕获。

标签: c++ c++11 lambda


【解决方案1】:

正式地,[&] 确实通过引用捕获了 this,根据 5.1.2/16“如果实体被隐式或显式地通过引用捕获被捕获但未被复制捕获。”但这没关系,因为

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-28
    相关资源
    最近更新 更多