【发布时间】: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) * <PixelType bitcount>,或者近似0.69314718056 * sizeof(PixelType) * 8。 -
这是一个很好且简单的替代方案@ChristopherOicles
标签: c++ c++11 visual-c++ c++14