Answers:
捕获列表中明确命名的每个变量均被捕获。默认捕获将仅捕获以下两个变量:(a)在捕获列表中未明确命名的变量和(b)在lambda表达式主体中使用的变量。如果未明确命名变量,并且您未在lambda表达式中使用该变量,则不会捕获该变量。在您的示例中,my_huge_vector
未捕获。
根据C ++ 11§5.1.2[expr.prim.lambda] / 11:
如果λ-表达具有相关联捕捉默认及其化合物语句 ODR用途
this
或具有自动存储持续时间和所述的可变ODR使用的实体没有明确地捕获,则ODR使用的实体被认为是隐式地捕获。
您的lambda表达式具有关联的捕获默认值:默认情况下,您使用值来捕获变量[=]
。
当且仅当使用了变量(在“一个定义规则”中,术语“已使用”的含义)是隐式捕获的变量。由于您根本不使用my_huge_vector
lambda表达式的主体(“复合语句”),因此不会隐式捕获它。
继续第5.1.2 / 14节
如果存在,则通过复制捕获实体
- 它被隐式捕获,并且capture-default为
=
或- 使用不包含的捕获显式捕获它
&
。
由于您my_huge_vector
不会被隐式捕获,也不会被显式捕获,因此根本不会通过复制或引用来捕获您。
不,my_huge_vector
不会被捕获。[=]
表示所有使用的变量都在lambda中捕获。
void f() { const int size(10); [] { int x[size]; }; }
。在这里,size
不会被捕获,但是没关系,因为它不是在ODR的意义上使用的。(Visual C ++ 2010不接受此代码,可能是由于VC10发布后规范发生了变化,也可能是由于有错误导致的bug,可能这将在以后的版本中得到修复; g ++ 4.5.1接受了此代码。)
const
内容不会发生变异。除非超级激进的优化标志OX或其他东西。