这样规定的目的有两个:
1. 引用即别名(alias)的规则。C++里几乎任何时候一个T&变量和它所指向的原始T变量用起来都是完全等价的。引用只是换个名字,不应该造成效果上的区别。
2. 功能合理性。以上面的例子为例:
const string& s = ...;
auto f = [s]() {...};
按现在的规则是s会被拷贝一份,那么这个lambda就是安全的。
如果把规则改成此时s被capture的是一个引用,那么怎么改代码才能让这个安全呢?我们得:
const string& s = ...;
const string s2 = s;
auto f = [s2]() {...};
可以看到为了保证安全我们被迫拷贝了两次。这是很糟糕的设计。
【 在 z16166 的大作中提到: 】
: 字面理解:
: s如果是引用(即&T、&&T。无论CV属性),[s]就会导致在闭包的内部定义一个T类型(而不是&T、&&T类型)的auto变量。
: 目的也是为了防止可能存在的dangling reference吧。
: ...................
--
FROM 76.126.252.*