簡體   English   中英

使用 std::acos 和 clang++ 而不是 g++ 的 Constexpr 編譯錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM