gpt4 book ai didi

c++ - 我可以在 lambda 中使用 constexpr 值而不捕获它吗?

转载 作者:IT老高 更新时间:2023-10-28 22:14:59 28 4
gpt4 key购买 nike

我想在 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)提示

variable 'i' cannot be implicitly captured in a lambda with no capture-default specified

这应该被认为是 clang 3.8 中的一个错误吗?

顺便说一句:

上面的代码可以用 gcc 4.9.2 编译。如果我将 lambda 表达式更改为显式捕获:

...
auto f = [i]{
...

clang 3.8 编译它,但 gcc 4.9.2 失败:

error: the value of ‘i’ is not usable in a constant expression ...

最佳答案

Should this be considered a bug in clang 3.8?

是的。仅当 [expr.prim.lambda]/12 要求时才需要捕获:

enter image description here

请特别注意突出显示的示例。 f(x) 不需要捕获 x,因为它不是 odr 使用的(重载分辨率选择带有 object 参数的重载)。同样的论点适用于您的代码 - [basic.def.odr]/3:

A variable x whose name appears as a potentially-evaluated expression ex is odr-used by ex unless applying the lvalue-to-rvalue conversion (4.1) to x yields a constant expression (5.20) that does not invoke any non-trivial functions…

这个要求肯定满足。

…and, if x is an object, ex is an element of the set of potential results of an expression e, where either the lvalue-to-rvalue conversion (4.1) is applied to e, or e is a discarded-value expression (Clause 5).

i 是其根据 [basic.def.odr]/(2.1) 的潜在结果集,并且 l-t-r 转换确实立即应用,因为它传递给非类型模板参数对象类型。

因此,正如我们已经证明 (12.1) 不适用 - 并且 (12.2) 显然也不适用 - Clang 拒绝您的代码段是错误的。

关于c++ - 我可以在 lambda 中使用 constexpr 值而不捕获它吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33873788/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com