メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

constexpr 指定子が見つかりません

constexpr 指定子をコンパイル時の評価用の変数または関数に使用できる

説明

この欠陥は、潜在的な変数 constexpr と関数を示します。たとえば、この欠陥は次の状況で発生します。

  • コンパイル時に評価可能な式を使用することによって変数を初期化するときに、constexpr 指定子を省略した場合。

    欠陥チェッカーは、変数が次のいずれかを使用して初期化されてから、コード内で変更されていない場合に constexpr 指定子を使用しないローカル変数定義にフラグを設定します。

    • コンパイル時定数のみを含む式。

    • コンパイル時定数をパラメーターとして使用した関数の呼び出し (関数自体が constexpr の場合または関数にパラメーターを含む return ステートメントしか含まれていない場合)。

    • コンパイル時定数を使用したコンストラクター呼び出し (コンストラクターを含むクラスのすべてのメンバー関数自体が constexpr の場合)。

    チェッカーは、ローカルな静的変数にフラグを設定しません。

  • コンパイル時に評価される可能性がある 1 つの return ステートメントが含まれている関数から、constexpr 指定子を省略した場合 (コンパイル時定数が引数である場合)。

リスク

変数値が、変数定義前に constexpr を使用して、コンパイル時定数しか含まれない式から計算される場合は、次のようになります。

constexpr double eValSquared = 2.718*2.718;
これにより、式がコンパイル時に必ず評価されます。コンパイル時評価によって、実行時オーバーヘッドが節約されます。実行時のパフォーマンス向上が顕著な場合もあります。

式をコンパイル時に評価できない場合は、constexpr キーワードによって、コンパイル エラーが必ず表示されます。その後で、可能であれば、根本的な問題を修正できます。

const キーワードでは、コンパイル時評価が保証されないことに注意してください。const キーワードは、初期化後の変数値の直接修正を禁止するだけです。変数の初期化方法によっては、コンパイル時または実行時に初期化を実行できます。

修正方法

constexpr 指定子を変数または関数の定義に追加します。

パフォーマンスの改善の程度は、使用しているコンパイラ、ライブラリ実装、環境によって異なる可能性があります。

すべて展開する

double squareIfPositive(double val) {
    return val > 0? (val * val): 0;
}

void initialize(void) {
    double eVal = 2.718;
    double eValSquare = squareIfPositive(2.718);
}

この例では、チェッカーが squareIfPositive の定義にフラグを設定します。これは、この関数に 1 つの return ステートメントが含まれており、このステートメントにはパラメーター val のみが使用されているためです。したがって、val がコンパイル時定数である場合、この関数はコンパイル時に評価され、関数 constexpr となる可能性があります。

チェッカーはまた、eValSquare の定義にもフラグを設定します。これは、コンパイル時定数を引数としてとる潜在的な関数 constexpr で初期化されるためです。

修正 – constexpr 指定子を追加

constexpr 指定子を変数と関数の定義に追加します。

constexpr double squareIfPositive(double val) {
    return val > 0? (val * val): 0;
}

void initialize(void) {
    constexpr double eVal = 2.718;
    constexpr double eValSquare = squareIfPositive(2.718);
}

結果情報

グループ: パフォーマンス
言語: C++
既定値: オフ
コマンド ライン構文: MISSING_CONSTEXPR
影響度:Medium

バージョン履歴

R2020b で導入

すべて展開する