GCC では、Constexpr 以外の標準ライブラリ関数を Constexpr として扱うことができますか?
GCC は、静的 constexpr 変数を非 constexpr で初期化するコードをコンパイルします警告を発行しない標準ライブラリ関数 (例の関数など)以下:
#include <cmath> struct foo { static constexpr double a = std::cos(3.); static constexpr double c = std::exp(3.); static constexpr double d = std::log(3.); static constexpr double e1 = std::asin(1.); static constexpr double h = std::sqrt(.1); static constexpr double p = std::pow(1.3,-0.75); };
C 11 および C 14 標準に従って、constexpr 以外の関数は定数式で使用できません。ただし、GCC は、明示的にそのようにマークされていない場合でも、一部の組み込み標準ライブラリ関数を constexpr として扱います。
この動作は、C 14 の非準拠拡張機能です。ドラフト C 14 標準では、次のような実装を禁止しています。明示的に必要でない限り、標準ライブラリ関数のシグネチャを constexpr として宣言します。
C 11 では、この拡張を許可することからコンセンサスが移行しました。それを禁止すること。これは、関数を異なる方法で処理する実装が異なると、SFINAE を使用する際の動作の相違につながる可能性があるためです。
GCC は当初、LWG 問題 2013 の以前に提案された解決策に依存していました。これにより、実装は、一定の条件を満たす場合に任意の関数を constexpr として宣言できるようになりました。制約。これが、GCC がこれらの関数を厳密準拠モードの constexpr として扱う理由です。
ただし、解像度は C 14 で変更され、この拡張機能は現在非準拠とみなされます。 GCC はこの問題に対処し、警告を発行するか、厳密準拠モードでこの動作を無効にすることが期待されています。
コンパイラの組み込み関数はこの問題の対象ではないため、constexpr コンテキストでの使用は許可されるべきであることに注意してください。
以上がGCC は Constexpr コンテキストで非 Constexpr 標準ライブラリ関数を許可しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。