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
}
};