![](/img/trans.png)
[英]std::map non-const functors, compile time error under clang++, ok for g++
[英]Constexpr compile error using std::acos with clang++ not g++
我想嘗試將項目從 gcc 遷移到 clang++。 我承認我的無知,我不知道為什么下面的代碼
template <typename T>
constexpr T pi{std::acos(T(-1.0))};
使用 g++ 靜默編譯,但 clang++ 產生錯誤
trig.hpp:3:13: error: constexpr variable 'pi<float>' must be initialized by a constant expression
constexpr T pi{std::acos(T(-1.0))};
我希望有人比我更了解它,可以啟發我。
注意:嘗試使用 -std=C++14 和 C++1y。 在 clang 版本 3.6.2 (tags/RELEASE_362/final) 下失敗。 適用於 g++ (GCC) 5.2.0。
Clang 在這里是正確的,我們不允許在常量表達式中使用acos
。
問題是acos在標准中沒有標記為 constexpr 但gcc 將標准中未標記的一些函數包括 acos 視為 constexpr 。 這是一個不符合標准的擴展,最終應該在 gcc 中修復。
內置函數通常用於常量折疊,我們可以看到如果我們將-fno-builtin
與 gcc 一起使用,它會禁用這種不符合規范的行為,我們將收到以下錯誤:
error: call to non-constexpr function 'double acos(double)'
constexpr T pi{std::acos(T(-1.0))};
^
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.