13

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

那是,

[=, this]{ };  // error
[&, this]{ };  // OK

这是由 C++11 5.1.2/8 指定的。

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

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

4

1 回答 1

11

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

于 2012-10-20T21:35:04.040 回答