[英]MSVC constexpr function 'xyz' cannot result in a constant expression
[英]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上運行。
我的問題是:
謝謝
這似乎是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.