对于声明为foo
的{{1}},lambdas的按值捕获和按引用捕获语义之间有什么区别吗?
答案 0 :(得分:16)
我认为你已经陷入了一种常见的误解......引用别名指向真实对象。初始化之后,对引用的任何使用都完全等同于原始对象的使用。如果你考虑这个问题,这个问题就没那么有意义了如果引用 对象,那么[foo](){}
的行为将完全相同,无论foo
是对象还是对象的引用。
答案 1 :(得分:12)
是的,有区别。
§5.1.2 [expr.prim.lambda] p14
如果隐式捕获并且 capture-default 为
=
,或者如果使用捕获明确捕获实体,则捕获实体不包括&
。对于由副本捕获的每个实体,在闭包类型中声明一个未命名的非静态数据成员。这些成员的声明顺序未指定。 如果实体不是对象的引用,则此类数据成员的类型是相应捕获实体的类型,否则引用类型。
因此,如果您捕获一个按值命名引用的标识符,您将获得引用对象的副本。