关于默认捕获模式的限制和C++ lambda-expression中的'this'

yoh*_*hjp 10 c++ lambda c++11

我想知道为什么= 捕获默认模式禁止this在C++ lambda表达式的捕获列表中.

那是,

[=, this]{ };  // error
[&, this]{ };  // OK
Run Code Online (Sandbox Code Playgroud)

这由C++ 11 5.1.2/8指定.

  • 如果lambda-capture包含一个捕获默认值为&,则lambda-capture中的标识符不应以&开头.
  • 如果lambda-capture包含一个=的capture-default,则lambda-capture不应该包含这个,并且它包含的每个标识符都应以&开头.

问:这条规则有什么理由或背景故事吗?

Jes*_*ood 9

this只能通过复制捕获,永远不能通过引用捕获.即使您只指定了[&],this如果使用了odr ,也可以通过复制隐式捕获.因此,[=, this]是一个错误,因为=已经this通过副本隐式捕获,而&in [&, this]表示通过引用捕获并且不隐式捕获this(除非它使用了odr)

  • 不,默认情况下,[[]]不会隐式捕获this。**但是**,如果您在括号({})中使用`this`,例如在访问成员变量等时,**然后**会被[[]隐式捕获(但是*仍然*是通过复制而不是引用捕获的)。 (2认同)