メインコンテンツ

AUTOSAR C++14 Rule A7-1-2

The constexpr specifier shall be used for values that can be determined at compile time

説明

ルール定義

The constexpr specifier shall be used for values that can be determined at compile time.

根拠

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

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

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

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

Polyspace 実装

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

  • リテラル値などのコンパイル時定義。

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

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

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

トラブルシューティング

ルール違反が想定されるものの、Polyspace® から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。

すべて展開する

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

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

void initialize(void) {
    double eVal = 2.718; //Noncompliant
    double eValSquare = squareIfPositive(2.718); //Noncompliant
    const double eValCubed = 2.718 * 2.718 * 2.718; //Noncompliant
    
    constexpr double eValSquareAnother = square(2.718); //Compliant
}

この例では、関数 initialize 内の最初の 3 つの変数定義がルールに違反しています。これは、変数がリテラル値を含む式で初期化され、constexpr キーワードが省略されているためです。

チェック情報

グループ: 宣言
カテゴリ: Required、Automated

バージョン履歴

R2020b で導入

すべて展開する