Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通过引用捕获lambda中的此指针_C++_C++11_Lambda - Fatal编程技术网

C++ 通过引用捕获lambda中的此指针

C++ 通过引用捕获lambda中的此指针,c++,c++11,lambda,C++,C++11,Lambda,第一种情况不起作用,但第二种情况起作用。为什么会这样? 我看到标准5.1.2/1: 捕获: 标识符 &标识符 这个 (即&这不存在) 和5.1.2/15: 如果实体是隐式或显式的,则通过引用捕获该实体 已捕获但未被副本捕获 在第二种情况下,根据第5.1.2/14条的规定,副本未捕捉到“本文件”: 如果实体隐式捕获,并且 捕获默认值为=,或者如果它是通过捕获显式捕获的 这不包括& 但是我如何通过值显式地捕获“this”指针呢?或者只可能通过默认捕获隐式捕获&?形式上,[&]确实通过引用捕获了此,根

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

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

(即&这不存在)

和5.1.2/15:

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

在第二种情况下,根据第5.1.2/14条的规定,副本未捕捉到“本文件”:

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


但是我如何通过值显式地捕获“this”指针呢?或者只可能通过默认捕获隐式捕获&?

形式上,
[&]
确实通过引用捕获了
,根据5.1.2/16“如果实体隐式或显式捕获但不通过副本捕获,则通过引用捕获。”但这并不重要,因为

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


因此,对于
这个
,复制捕获和引用捕获是无法区分的。出于所有实际目的,
总是通过副本捕获。

正式而言,
[&]
确实通过引用捕获此,根据5.1.2/16“如果实体隐式或显式捕获但未通过副本捕获,则通过引用捕获实体。”但这并不重要,因为

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


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

最后一行应该回答您的问题
或者如果它是通过不包含&
的捕获显式捕获的,则通过引用捕获
是没有意义的-您不能修改它,也不能获取它的地址。如果你愿意的话,你可以像
[this]
那样通过值显式地捕捉它。
这个
只能通过值捕捉。最后一行应该回答你的问题
或者如果它是通过不包含&
的捕获显式捕获的,则通过引用捕获
是没有意义的-您不能修改它,也不能获取它的地址。如果您愿意,您可以通过值显式地捕获它,如
[this]
只能通过值捕获。
struct CL
{
    int i;
    void fnc()
    {
        [&this](){i=1;};  // (1) error
        [&](){i=1;};      // (2) ok
    }
};