gpt4 book ai didi

c++ - 在非 `constexpr` 上下文 : clang vs gcc 中的 -`constexpr` 函数中使用 lambda

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:23:40 25 4
gpt4 key购买 nike

考虑以下代码( available on gcc.godbolt.org ):

template <typename TF>
constexpr auto fn_x(TF f)
{
return f();
}

constexpr auto get_x()
{
return fn_x([]{ return 0; });
}

int main()
{
auto res = get_x();
}

它在 g++ 5.3.x 和更新的 (包括 g++ 6.x.x) 下编译。

它不能在 clang++ 3.7.x 和更新版本下编译,并出现以下错误:

error: constexpr function never produces a constant expression [-Winvalid-constexpr]
constexpr auto get_x()
^
note: subexpression not valid in a constant expression
return fn_x([]{ return 0; });

使代码同时使用 gcc 和 clang 编译的可能解决方案是使用带有 decltype 的“间接层”,同时在函数中删除 constexpr定义 lambda 的位置:gcc.godbolt.org link .

根据标准,这里哪个编译器是正确的?

最佳答案

两个编译器都同意 get_x() 不能用在常量表达式中。您可以通过将 auto res = get_x(); 更改为 constexpr auto res = get_x(); 来判断,GCC 将同样拒绝它。

至于像 clang 那样在函数定义时检测它,而不是像 gcc 那样在函数使用时检测它,两者都是允许的:(强调我的)

7.1.5 The constexpr specifier [dcl.constexpr]

5 For a non-template, non-defaulted constexpr function or a non-template, non-defaulted, non-inheriting constexpr constructor, if no argument values exist such that an invocation of the function or constructor could be an evaluated subexpression of a core constant expression (5.19), the program is ill-formed; no diagnostic required. [...]

在一般情况下,不可能可靠地检测是否存在允许在常量表达式中使用结果的函数调用,这就是为什么诊断是可选的。

关于c++ - 在非 `constexpr` 上下文 : clang vs gcc 中的 -`constexpr` 函数中使用 lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35659155/

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