2015-09-28 11 views
7

でエラーをコンパイル私は++打ち鳴らすためにはgccからのプロジェクトの移行を試してみたいです。私は、コードconstexprの打ち鳴らす++ではないグラム++

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))}; 

を生成し、私はについての詳細を知っている誰かを期待していた理由は、私はわからないんだけど、私の部分に無知を認めますそれは私よりも私を啓発することができます。

NB:-std = C++ 14とC++ 1Yと試みました。 clangバージョン3.6.2(タグ/ RELEASE_362/final)で失敗します。 g ++(GCC)5.2.0で動作します。

+3

はに関連して見える[それは準拠ですconstexprとして非constexprの標準ライブラリ関数を処理するためのコンパイラ拡張?](http://stackoverflow.com/q/27744079/1708801) –

+0

@ShafikYaghmour私はうまく検索したと思った。私は間違っていた。ありがとうございました。これは本当に失望の結果です。私はGCCが標準で禁止されているものを許可しようとしているときに、少なくとも警告を出さないことにも驚いています。私は - ペディアンと一緒にコンパイルしていた! 回答を書く場合は、私はそれを受け入れます。 – Timtro

+1

私はその質問が来ていなかった驚いていないよ、キーワードでの重複は最小限のようです。私が最初にこれに遭遇したのは約1年前でした。私は何も見つけられませんでした。私はその作品を一緒に置くことができたときに私が誤って言語ワーキンググループの問題2013に遭遇するまででした。 –

答えて

9

クランがここに正確である、我々は定数式でacosを使用することはできません。

問題はacosは標準しかしgcc treats some functions not marked in the standard including acos as constexprで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))}; 
         ^
関連する問題