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

Elo*_*off 13 c++ lambda c++11

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

Dav*_*eas 16

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

  • @Eloff:我觉得你不明白我说的话.当然,*copy*和***是完全不同的东西.您似乎没有意识到的是*初始化之后*引用是原始对象的**别名**.是否存在底层指针,语义就像使用*original*对象一样.你的整个评论都偏离正轨. (2认同)

Xeo*_*Xeo 12

是,有一点不同.

§5.1.2 [expr.prim.lambda] p14

如果实体被隐式捕获并且捕获默认值为或者如果使用不包含的捕获显式捕获实体,则通过副本捕获实体.对于由副本捕获的每个实体,在闭包类型中声明一个未命名的非静态数据成员.这些成员的声明顺序未指定.如果实体不是对对象的引用,则这种数据成员的类型是对应的捕获实体的类型,否则是引用的类型.=&

因此,如果捕获按值命名引用的标识符,则会获得引用对象的副本.

  • 不,没关系,因为允许访问全局变量.输出应为2,前提是您不要忘记用0初始化i. (2认同)