如果'foo'是引用变量,[& foo] {...}捕获和[foo] {...}捕获之间是否有区别?

时间:2012-08-31 13:53:11

标签: c++ lambda c++11

对于声明为foo的{​​{1}},lambdas的按值捕获和按引用捕获语义之间有什么区别吗?

2 个答案:

答案 0 :(得分:16)

我认为你已经陷入了一种常见的误解......引用别名指向真实对象。初始化之后,对引用的任何使用都完全等同于原始对象的使用。如果你考虑这个问题,这个问题就没那么有意义了如果引用 对象,那么[foo](){}的行为将完全相同,无论foo是对象还是对象的引用。

答案 1 :(得分:12)

是的,有区别。

§5.1.2 [expr.prim.lambda] p14

  

如果隐式捕获并且 capture-default =,或者如果使用捕获明确捕获实体,则捕获实体不包括&。对于由副本捕获的每个实体,在闭包类型中声明一个未命名的非静态数据成员。这些成员的声明顺序未指定。 如果实体不是对象的引用,则此类数据成员的类型是相应捕获实体的类型,否则引用类型

因此,如果您捕获一个按值命名引用的标识符,您将获得引用对象的副本。