这个指针在lambda中通过引用捕获

时间:2015-04-19 12:10:41

标签: c++ c++11 lambda

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的副本获取:

  

如果隐式捕获实体,则通过副本捕获实体   capture-default is = 或者如果使用捕获显式捕获它   不包括&

但我怎样才能抓住这个"这个"指针值显式?或者只能隐含地使用 default-capture & ?

1 个答案:

答案 0 :(得分:5)

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

  

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

因此,对于this,逐个拷贝和按引用捕获是无法区分的。出于所有实际目的,this总是通过副本捕获。