gpt4 book ai didi

c++ - __builtin_round 不是常量表达式

转载 作者:可可西里 更新时间:2023-11-01 17:54:30 26 4
gpt4 key购买 nike

在 G++ 中,各种内置数学函数在某些条件下是 constexpr。例如,以下编译:

static constexpr double A = __builtin_sqrt(16.0);
static constexpr double B = __builtin_pow(A, 2.0);

虽然它们并不总是 constexpr,这取决于参数。例如,__builtin_sqrt(NAN) 在用作常量表达式时会导致编译错误。

但我遇到了一个奇怪的情况,在我看来它应该是 constexpr,但它不是:

static constexpr double value () { return 1.23; }
static constexpr double result = __builtin_round(__builtin_sqrt(value()));

这会产生:

a.cpp:2:73: error: ‘__builtin_round(1.1090536506409416e+0)’ is not a constant expression
static constexpr double result = __builtin_round(__builtin_sqrt(value()));
^

我尝试了上述代码的变体,我发现:

  • __builtin_round 在这个问题中有一些特殊的作用。将其替换为其他一些内置数学函数,例如 sqrtpow 可解决该错误。所以看起来 __builtin_round 只是缺少 constexpr 支持。但是……
  • 如果 value() 被文字 1.23 替换,那也会消除错误。
  • 删除 __builtin_sqrt,只留下 __builtin_round(value()),也消除了错误。

我想知道为什么 round 以这种方式运行,以及是否有任何解决方法。

注意。我知道内置数学函数及其 constexpr-ness 是非标准的编译器特定功能。请不要教我如何不应该使用它,或者我不应该如何尝试进行编译时数学计算。就我而言,拥有 constexpr 数学是一个重要的特性,我可以接受依赖于 G++。

最佳答案

我想到了另一种解决方法。

有:使用辅助函数pass_through

template<typename T>
constexpr T&& pass_through (T&& t) { return static_cast<T&&>(t); }

像这样使用它:

static constexpr double value () { return 1.23; }
static constexpr double result = __builtin_round(pass_through(__builtin_sqrt(value())));

此代码在 G++ 中编译无误。

我也同意这个问题应该报告给 GCC 的意见。

关于c++ - __builtin_round 不是常量表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23447782/

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