以下の定義には違いがありますか?
const double PI = 3.141592653589793;
constexpr double PI = 3.141592653589793;
そうでない場合、C++11 ではどのスタイルが推奨されますか?
ベストアンサー1
違いがあると思います。もっと簡単に話せるように名前を変えてみましょう。
const double PI1 = 3.141592653589793;
constexpr double PI2 = 3.141592653589793;
PI1
と は両方ともPI2
定数であるため、変更できません。ただし、のみは 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
どちらを使用すべきでしょうか? ニーズを満たす方を使用してください。コンパイル時定数が必要なコンテキストで使用できるコンパイル時定数があることを確認したいですか? 実行時に行われる計算でそれを初期化できるようにしたいですか? など。