【问题标题】:Why standard library function of a constexpr is not a constant? [duplicate]为什么 constexpr 的标准库函数不是常量? [复制]
【发布时间】:2017-01-20 23:32:00
【问题描述】:
constexpr PixelType maxVal = std::numeric_limits<PixelType>::max();
constexpr double lnFactor = std::log(maxVal);

第二行给出错误 C2131:表达式未计算为常量

为什么?可以改写它以便编译吗?

【问题讨论】:

  • std::log 不是constexpr
  • 计算对数的方法有很多种,但并不是所有的方法都可以在编译时轻松完成(这是constexpr背后的基本前提)。由于 C++ 标准不能强制库编写者使用可在编译时评估的变体,因此它不能转换为 constexpr 函数。所以你根本不能在编译时用它来计算对数。
  • 也许你可以使用这个:如果PixelType是一个无符号整数类型,log(maxVal + 1) == log(2) * &lt;PixelType bitcount&gt;,或者近似0.69314718056 * sizeof(PixelType) * 8
  • 这是一个很好且简单的替代方案@ChristopherOicles

标签: c++ c++11 visual-c++ c++14


【解决方案1】:

出现编译错误的原因是std::log 不是constexpr

我不知道有一种可移植的方式让它与constexpr 一起工作,但GCC 有__builtin_log 可以在constexpr 上下文(godbolt)中工作:

constexpr double lnFactor = __builtin_log(42.0);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    • 2016-03-15
    • 2017-08-02
    • 2021-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多