我想在lambda中使用constexpr值。阅读答案
Using lambda captured constexpr value as an array dimension,我假设以下应该工作:
#include<array>
int main()
{
constexpr int i = 0;
auto f = []{
std::array<int, i> a;
};
return 0;
}
但是,Clang 3.8(std = c++ 14)提示
应该将其视为clang 3.8中的错误吗?
顺便说一句:
上面的代码使用gcc 4.9.2进行编译。
如果我更改lambda表达式以显式捕获:
...
auto f = [i]{
...
clang 3.8编译它,但是gcc 4.9.2失败:
最佳答案
是的仅在[expr.prim.lambda]/12要求如此时才需要捕获:
特别注意突出显示的示例。 f(x)
不需要捕获x
,因为它不是odr用的(重载分辨率通过object参数选择重载)。相同的论点适用于您的代码-[basic.def.odr]/3:
当然可以满足这个要求。
i
是其根据[basic.def.odr]/(2.1)得出的潜在结果的集合,并且l-t-r转换确实在传递给对象类型的非类型模板参数后立即应用。
因此,正如我们已经表明(12.1)不适用-(12.2)显然也不适用-Clang拒绝您的代码段是错误的。
关于c++ - 我可以在不捕获lambda的情况下使用constexpr值吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33873788/