繁体   English   中英

constexpr - 函数不能用于常量表达式

[英]constexpr - function cannot be used in a constant expression

我想在编译时为给定范围内的数学函数计算查找表,然后在运行时从表中检索值。 我的代码如下:

#include <iostream>
#include <cmath>


template<int size>
class LookupTable {
public:
constexpr LookupTable(double xMin, double xMax) : array(), xMin(xMin), xMax(xMax), dx((xMax - xMin) / (size - 1)) {
    for(auto i = 0; i < size; ++i)
        array[i] = exp(xMin + i * dx);
}

constexpr double operator()(double x) const {
    return array[std::min(std::max(static_cast<int>((x - xMin) / dx), 0), size-1)];
}

private:
double array[size];
double xMin;
double xMax;
double dx;
};



int main() {
    const double x = 0.5;
    constexpr LookupTable<10000> table(0.0, 1.0);
    std::cout << "f(x) = " << table(x) << std::endl;  // evaluated at compile time ?
    std::cout << "f(x) = " << LookupTable<10000>(0.0, 1.0)(x) << std::endl;  // evaluated at run time ?
    return 0;
}

代码编译并在gcc 5.1及更高版本上运行,但不在Clang 3.8上运行。 Clang的错误消息是:constexpr变量'table'必须由常量表达式初始化,非constexpr函数'exp'不能用于常量表达式。

当我删除constexpr时:

constexpr LookupTable<10000> table(0.0, 1.0);

然后代码也编译并在Clang上运行。

我的问题是:

  • 错误消息“function'exp'不能用于常量表达式”是什么意思? 有解决方法吗?
  • 这是否意味着当我声明LookupTable <10000>表(0.0,1.0)时; 如果没有constexpr,那么表预计算会在运行时发生吗? 我正在使用在线编译工具,所以我现在没有选择对代码进行基准测试。
  • 我想概括代码并模拟数学函数。 它可以与仿函数一起使用,但是可以使用lambdas吗?

谢谢

这似乎是gcc的不符合扩展,因为在<cmath>没有constexpr声明exp()

17.6.5.6 constexpr函数和构造函数[constexpr.functions]

1该标准明确要求某些标准库函数为constexpr(7.1.5)。 实现不应将任何标准库函数签名声明为constexpr,除非明确要求它。 在提供constexpr函数或构造函数的任何非定义声明的任何头中,实现应提供相应的定义。

如果没有LookupTable前面的constexpr ,它确实会在运行时LookupTable 解决方法是使其成为static变量,以便您可以在启动时对其进行初始化。

如果你想要constexpr数学函数,你需要编写自己的函数,或者编写一个标准的提议,将当前的<cmath>库修改为constexpr

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM