原因[&this]
不起作用是因为它是语法错误。中的每个参数以逗号分隔lambda-introducer
is a capture
:
capture:
identifier
& identifier
this
你可以看到&this
语法上不允许。不允许的原因是因为你永远不想捕捉this
通过引用,因为它是一个小的 const 指针。您只想按值传递它 - 所以该语言不支持捕获this
引用。
捕捉this
明确地你可以使用[this]
as the lambda-introducer
.
首先capture
可以是一个capture-default
这是:
capture-default:
&
=
这意味着通过引用自动捕获我使用的任何内容(&
) 或按值 (=
)分别 - 然而治疗this
是特殊的 - 在这两种情况下,由于前面给出的原因,它都是通过值捕获的(即使默认捕获&
,通常意味着通过引用捕获)。
5.1.2.7/8:
为了名称查找(3.4)的目的,确定this
(9.3.2) 和转换 id-
使用以下方法将引用非静态类成员的表达式转换为类成员访问表达式(*this)
(9.3.1),
复合语句 [OF THE LAMBDA] 在 lambda 表达式的上下文中考虑。
因此,当使用成员名称时,lambda 的行为就好像它是封闭成员函数的一部分(就像在您的示例中使用名称x
),所以它会生成“隐式用法”this
就像成员函数一样。
如果 lambda 捕获包含捕获默认值,则为&
, lambda 捕获中的标识符不应是
之前是&
。如果 lambda 捕获包含捕获默认值,则为=
, lambda 捕获不应包含this
并且它包含的每个标识符前面应带有&
。标识符或this
不得出现超过
一旦进入 lambda 捕获。
所以你可以使用[this]
, [&]
, [=]
or [&,this]
as a lambda-introducer
捕捉this
按值指针。
However [&this]
and [=, this]
格式不正确。在最后一种情况下,gcc 会宽容地警告[=,this]
that explicit by-copy capture of ‘this’ redundant with by-copy capture default
而不是错误。