constexpr 非 constexpr 標準ライブラリ関数の処理に準拠したコンパイラ拡張機能?
C 11 では、ドラフト標準で標準の処理が可能になったようです。ライブラリは、明示的にそのようにマークされていない場合でも、constexpr として機能します。ただし、このスタンスはその後進化しました。
C 14 の進化
C 14 では、標準で必須でない関数は constexpr として宣言すべきではないと明示的に述べられています。実装。これについては、C 14 ドラフト標準のセクション 17.6.5.6 で概説されています。
An implementation shall not declare any standard library function signature as constexpr except for those where it is explicitly required.
この決定は、特に SFINAE の使用法が観察可能な異なる動作につながる実装の相違を防ぐために行われました。
GCC の実装
以前に処理された GCC特定の非 constexpr 標準ライブラリは、以前の LWG 2013 提案決議に基づいて constexpr として機能します。ただし、この動作は C 14 では適合とみなされなくなりました。
厳密モードでの警告不在
不適合にもかかわらず、GCC は厳密モードで警告を生成しません ( -std=c 11 -衒学的)。これはおそらく将来の更新で対処される見落としです。
組み込みの除外
コンパイラ組み込みには、標準ライブラリ関数と同じルールは適用されません。したがって、次のような組み込み関数を使用することは、
static constexpr double a = __builtin_cos(3.);
に準拠しているとみなされる必要があります。
結論
constexpr 以外の標準ライブラリ関数を現在 constexpr として扱うことは、 C 14 では不適合な拡張子。GCC は以前の拡張子に基づいて C 11 でこれを許可していましたが、提案の決議により、この拡張機能は削除されるか、現在の C 14 標準に準拠するように変更されることが予想されます。
以上がC 14 コンパイラは、constexpr 以外の標準ライブラリ関数を「constexpr」として適切に扱うことができますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。