簡體   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