gre*_*reg 5 c++ g++ cmath constexpr c++14
我想在编译时为给定范围内的数学函数计算查找表,然后在运行时从表中检索值.我的代码如下:
#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;
}
Run Code Online (Sandbox Code Playgroud)
代码编译并在gcc 5.1及更高版本上运行,但不在Clang 3.8上运行.Clang的错误消息是:constexpr变量'table'必须由常量表达式初始化,非constexpr函数'exp'不能用于常量表达式.
当我删除constexpr时:
constexpr LookupTable<10000> table(0.0, 1.0);
Run Code Online (Sandbox Code Playgroud)
然后代码也编译并在Clang上运行.
我的问题是:
谢谢
这似乎是gcc的不符合扩展,因为exp()
声明没有constexpr
在<cmath>
:
17.6.5.6 constexpr函数和构造函数[constexpr.functions]
1该标准明确要求某些标准库函数为constexpr(7.1.5).实现不应将任何标准库函数签名声明为constexpr,除非明确要求它.在提供constexpr函数或构造函数的任何非定义声明的任何头中,实现应提供相应的定义.
没有constexpr
在你面前LookupTable
,它确实会在运行时被初始化.解决方法是将其变为static
变量,以便您可以在启动时对其进行初始化.
如果您需要constexpr
数学函数,则需要编写自己的函数,或者编写一个标准建议,将当前<cmath>
库修改为constexpr
.
归档时间: |
|
查看次数: |
3162 次 |
最近记录: |