1. ホーム
  2. c++

[解決済み] 変数における const と constexpr の比較

2022-03-26 18:21:46

質問

以下の定義に違いはありますか?

const     double PI = 3.141592653589793;
constexpr double PI = 3.141592653589793;

そうでない場合、C++11ではどのスタイルが好まれるのでしょうか?

どのように解決するのですか?

違いがあるのだと思います。 もっと気軽に話せるように、名前を変えよう。

const     double PI1 = 3.141592653589793;
constexpr double PI2 = 3.141592653589793;

両方 PI1PI2 は定数であり、変更することはできません。 ばかり PI2 はコンパイル時定数です。 それは べし はコンパイル時に初期化されます。 PI1 は、コンパイル時またはランタイムに初期化される可能性があります。 さらに のみ PI2 は、コンパイル時定数を必要とするコンテキストで使用することができます。 例えば

constexpr double PI3 = PI1;  // error

が、です。

constexpr double PI3 = PI2;  // ok

とします。

static_assert(PI1 == 3.141592653589793, "");  // error

が、です。

static_assert(PI2 == 3.141592653589793, "");  // ok

どちらを使うべきでしょうか? あなたのニーズに合ったものを使ってください。 コンパイル時定数が必要な場面で使えるコンパイル時定数を確保したいのか? それとも、実行時の計算で初期化できるようにしたいですか? などなど。