私は C++ の新constexpr
機能を見てきましたが、その必要性を完全には理解していません。
たとえば、次のコード:
constexpr int MaxSize()
{
...
return ...;
}
void foo()
{
int vec[MaxSize()];
}
次のように置き換えることができます:
int MaxSize()
{
...
return ...;
}
static const int s_maxSize = MaxSize();
foo()
{
int vec[s_maxSize];
}
アップデート
2 番目の例は、実際には標準の ISO C++ ではありませんが (これを指摘してくれた複数のユーザーに感謝します)、特定のコンパイラ (gcc など) がサポートしています。したがってconst
、プログラムが有効であるということではなく、gcc がこの非標準機能をサポートしているという事実です。(私の知る限り、これは配列が関数またはメソッドに対してローカルとして定義されている場合にのみ可能です。グローバル配列のサイズはコンパイル時にまだわかっている必要があるためです。) options なしでコンパイルすると-std=c++98 -pedantic-errors
、コード
int MaxSize()
{
return 10;
}
void foo()
{
int vec[MaxSize()];
}
gcc でコンパイルします。
そのため、これまでに寄せられたフィードバックを考慮して、私の質問を言い換えてみます (また、その間に行ったいくつかの追加の読書も)。
const
キーワードを多用しています。を使用const
すると、有効期間全体で特定の値を持つ定数を定義できます。定数は任意の式で初期化できます。式は一度評価されます。つまり、定数の作成時に評価されます。これらの場合、それはかなり役に立たないと思います。constexpr
定数値を定義する式が実行時ではなくコンパイル時に計算されるという点で、非常に小さな最適化が導入されます。複雑な初期化を伴う実行時定数が必要になるたびに、キーワード を使用しconst
ます。
そのconstexpr
ため、コンパイル時に定数を初期化する必要がある状況で役立つ場合があります。1 つの例はベクトル定義です。標準では、実行時のサイズの定義はサポートされていません。もう 1 つの例は、1 つ以上の型以外のパラメーターを持つテンプレートです。
そのような場合、私は通常マクロを使用します。
#define MAX_SIZE (10)
void foo()
{
int vec[MAX_SIZE];
}
しかし、私の理解が正しければ、関数は定義内constexpr
で関数の再帰呼び出しを許可するため、マクロよりも強力です。constexpr
しかし、このような複雑な計算を使用してコンパイル時の定数を定義したいと思った実用的なアプリケーションは思いつきません。
したがって、たとえそれが興味深い機能であったとしても、それが必要かどうか (つまり、マクロが十分でない状況をどのくらいの頻度で解決できるか) はまだ疑問に思っています。マクロでは解決できない実際の例をいくつか見てみると、この意見を変えるのに役立つかもしれません。