GCC 4.7.2 编译这个:
constexpr int i = 5;
[]{ std::integral_constant< int, i >(); }; // nonstandard: i not captured
但不是这个:
constexpr int i = 5;
[&i]{ std::integral_constant< int, i >(); }; // GCC says i not constexpr
根据 C++11 §5.1.2/15,后一个示例对我来说似乎是正确的:
如果实体被隐式或显式捕获但未通过副本捕获,则通过引用捕获实体。对于通过引用捕获的实体,是否在闭包类型中声明了其他未命名的非静态数据成员,这是未指定的。
似乎i
lambda 内捕获的对象是指封闭范围内的变量constexpr
,而不仅仅是一个const
引用。
该标准明确指出,按值捕获的使用被转换为对 lambda 对象的相应成员的使用。而且我认为 5.1.2 暗示我的解释是正确的。
有什么明确说明引用捕获是指封闭范围内的对象还是引用?