Lambda捕获constexpr对象

Pot*_*ter 22 c++ lambda constexpr c++11

GCC 4.7.2编译:

constexpr int i = 5;
[]{ std::integral_constant< int, i >(); }; // nonstandard: i not captured
Run Code Online (Sandbox Code Playgroud)

但不是这个:

constexpr int i = 5;
[&i]{ std::integral_constant< int, i >(); }; // GCC says i not constexpr
Run Code Online (Sandbox Code Playgroud)

根据C++11§5.1.2/ 15,后一个例子对我来说是正确的:

如果实体是隐式或显式捕获但未通过复制捕获,则通过引用捕获实体.未指定是否在闭包类型中为通过引用捕获的实体声明了其他未命名的非静态数据成员.

似乎ilambda中捕获的对象引用了封闭范围中的变量constexpr,而不仅仅是const引用.

该标准明确指出,使用按值捕获转换为对lambda对象的相应成员的使用.我认为5.1.2提示我的解释是正确的.

是否有任何明确说明通过引用捕获是否引用封闭范围中的对象或引用?

eca*_*mur 12

第二模板参数std::integral_constant< int, i >模板参数非类型的形式,具体的整数或枚举类型(14.3.2p1子弹1)等的类型必须是经转换的常量表达式int.

lambda表达式中,当化合物语句中使用了一个实体时,会发生隐式捕获(5.1.2p11); 在显式模板实例化中使用转换的常量表达式不是odr-use(3.2p3),因此第一个示例是有效的.

在第二个例子中,我认为gcc拒绝它是不正确的; 5.1.2p17在一份说明中说:

不是odr-use 的id表达式指的是原始实体,从不指向闭包类型的成员.

尽管该段落作为一个整体正在讨论通过副本进行捕获,但是没有理由不将此规则应用于通过引用捕获.毫不奇怪,标准尚不清楚; 实际上没有理由捕获可以通过引用在转换的常量表达式中使用的实体.