1. ホーム
  2. c++

[解決済み] C++11でconstexpr機能はいつ使うべきですか?

2022-03-14 10:33:05

質問

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

// preprocessor.
#define MEANING_OF_LIFE 42

// constants:
const int MeaningOfLife = 42;

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

もし私がリテラル値を返す関数を書いていて、コードレビューに来たとき、誰かがreturn 5と書く代わりに定数値を宣言すべきだと教えてくれるような気がします。

どうすればいい?

もうちょっと複雑なことをするとします。

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 を定数値で指定すると、実行時ではなく、コンパイル時に明示的に計算されます。

他の良い例としては DegreesToRadians という関数があります。 ラジアンより度の方が読みやすいと思うのは誰でも同じだろう。 180度はラジアンでは3.14159265(円周率)であることは知っていても、次のように書くともっと分かりやすい。

const float oneeighty = DegreesToRadians( 180.0f );

良い情報がたくさんあります。

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