我想知道为什么=
捕获默认模式禁止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不应该包含这个,并且它包含的每个标识符都应以&开头.
问:这条规则有什么理由或背景故事吗?
this
只能通过复制捕获,永远不能通过引用捕获.即使您只指定了[&]
,this
如果使用了odr ,也可以通过复制隐式捕获.因此,[=, this]
是一个错误,因为=
已经this
通过副本隐式捕获,而&
in [&, this]
表示通过引用捕获并且不隐式捕获this
(除非它使用了odr)