ホームページ > バックエンド開発 > C++ > GCC は Constexpr コンテキストで非 Constexpr 標準ライブラリ関数を許可しますか?

GCC は Constexpr コンテキストで非 Constexpr 標準ライブラリ関数を許可しますか?

Barbara Streisand
リリース: 2024-11-29 20:03:12
オリジナル
337 人が閲覧しました

Does GCC Allow Non-Constexpr Standard Library Functions in Constexpr Contexts?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート