constexpr 関数を書く代わりに定数を宣言するべきでしょうか? 質問する

constexpr 関数を書く代わりに定数を宣言するべきでしょうか? 質問する

「常に 5 を返す関数」があると、「関数を呼び出す」という意味が損なわれたり、薄められたりするように思えます。この機能には理由や必要性があるはずです。そうでなければ、C++11 には存在しないでしょう。なぜこの機能があるのでしょうか?

// preprocessor.
#define MEANING_OF_LIFE 42

// constants:
const int MeaningOfLife = 42;

// constexpr-function:
constexpr int MeaningOfLife () { return 42; }

リテラル値を返す関数を書いて、コードレビューをしたら、return 5 と書く代わりに定数値を宣言すべきだと誰かが言うだろうと思います。

ベストアンサー1

もう少し複雑なことを行うとします。

constexpr int MeaningOfLife ( int a, int b ) { return a * b; }

const int meaningOfLife = MeaningOfLife( 6, 7 );

これで、読みやすさを維持しながら定数まで評価できるようになり、定数を数値に設定するだけよりも少し複雑な処理が可能になります。

基本的に、何をしているかがより明確になるため、保守性が向上します。max( a, b )例を見てみましょう。

template< typename Type > constexpr Type max( Type a, Type b ) { return a < b ? b : a; }

maxこれは非常に単純な選択ですが、定数値で呼び出すと、実行時ではなくコンパイル時に明示的に計算されることを意味します。

もう 1 つの良い例は関数ですDegreesToRadians。誰もがラジアンよりも度数の方が読みやすいと感じています。180 度がラジアンでは 3.14159265 (円周率) であることはご存知かもしれませんが、次のように書くとはるかに明確になります。

const float oneeighty = DegreesToRadians( 180.0f );

ここにはたくさんの有益な情報があります:

http://en.cppreference.com/w/cpp/language/constexpr

おすすめ記事