非 constexpr 標準ライブラリ関数を Constexpr として扱う: 適合性分析
非 constexpr 標準を扱うコンパイラ拡張機能があるかどうかという問題が生じます。 constexpr に準拠したライブラリ関数。このような扱いが許可される可能性があることを示唆した C 11 規格草案の許容性にもかかわらず、その後の開発によりこの問題が明確になりました。
C 14 明示的禁止
C 14 、ドラフト標準セクション 17.6.5.6 では、次の場合を除き、実装では標準ライブラリ関数のシグネチャを constexpr として宣言してはならないと明示的に述べられています。明示的に必要です。この決定により、constexpr 以外の標準ライブラリ関数を constexpr として扱うことができなくなります。
GCC 拡張機能
GCC は、特定の組み込み関数を constexpr として扱う拡張機能を実装しました。 。ただし、この拡張機能は、更新された C 14 標準に基づいて非準拠とみなされます。
As-if ルールと監視可能な動作
当初は、as-if かどうかは不明でした。ルールが非 constexpr 関数を constexpr として扱うことを許可している場合。 as-if ルールでは、同等の観察可能な動作を生成する限り、実装が標準の要件から逸脱することが許可されます。ただし、関数の constexpr ステータスを変更すると、SFINAE テストで実証されているように、同一のコードを使用すると動作が異なるという観察可能な動作に影響します。
適合緩和策
GCC 拡張に準拠している場合、コンパイラは厳密準拠モード (-std=c など) で警告を発行する必要があります。 11 -pedantic) 非 constexpr 標準ライブラリ関数が constexpr コンテキストで使用される場合。
組み込み例外
コンパイラー組み込みは標準でカバーされておらず、例外となる場合があります。 constexpr 関数のルール。 constexpr としての組み込み組み込み関数 (__builtin_cos など) の使用は、潜在的に許可される可能性があります。
以上がconstexpr 以外の標準ライブラリ関数を「constexpr」として扱うことは C 標準に準拠していますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。