2015-09-28 120 views
7

我想試驗一個項目從gcc到clang ++。我承認無知就我而言,我不知道爲什麼代碼Constexpr編譯錯誤與鏗鏘++不g ++

template <typename T> 
constexpr T pi{std::acos(T(-1.0))}; 

下位相剋默默編譯++但鐺++產生錯誤

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。

+3

看起來相關[它是一個符合編譯器擴展將非constexpr標準庫函數視爲constexpr?](http://stackoverflow.com/q/27744079/1708801) –

+0

@ShafikYaghmour我以爲我搜索得很好。我錯了。謝謝。這確實是一個令人失望的結果。我也很驚訝,GCC在標準允許禁止的情況下至少會發出警告。我也正在編譯-pedantic! 如果你想寫一個答案,我會接受它。 – Timtro

+1

我不覺得這個問題沒有出現,關鍵字的重疊似乎很小。當我大約一年前第一次遇到這個問題時,我找不到任何東西,直到我意外地碰到2013年語言工作組的問題時,我才把它們放在一起。 –

回答

9

鏘在這裏是正確的,我們不允許在常量表達式中使用acos

問題是acos沒有在標準中標記爲constexpr,而是gcc treats some functions not marked in the standard including acos as constexpr。這是一個non-conforming extension,最終應該在gcc中修復。

Builtin functions經常被用來固定倍,我們可以看到,如果我們使用​​用gcc它禁用這個不符合規定的行爲,我們會收到以下錯誤:

error: call to non-constexpr function 'double acos(double)' 
constexpr T pi{std::acos(T(-1.0))}; 
         ^