13

对于foo声明为Foo& foo = ...;,lambdas 的按值捕获和按引用捕获语义之间有什么区别吗?

4

2 回答 2

16

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

于 2012-08-31T14:13:29.927 回答
12

是,有一点不同。

§5.1.2 [expr.prim.lambda] p14

如果实体被式捕获并且默认捕获=,或者如果使用不包含&. 对于复制捕获的每个实体,在闭包类型中声明了一个未命名的非静态数据成员。这些成员的声明顺序是未指定的。如果实体不是对对象的引用,则此类数据成员的类型是相应捕获实体的类型,否则为引用类型

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

于 2012-08-31T14:00:32.100 回答