メインコンテンツ

AUTOSAR C++14 Rule A12-1-2

Both NSDMI and a non-static member initializer in a constructor shall not be used in the same type

説明

ルール定義

Both NSDMI and a non-static member initializer in a constructor shall not be used in the same type.

根拠

クラスの非静的データ メンバーは、次のいずれかの方法で初期化できます。

  • 非静的データ メンバー初期化子 (NSDMI) を使用することにより、クラス本体のメンバーの宣言で行う。

  • コンストラクターの非静的メンバー初期化子を使用して行う。

クラスで、一部の非静的データ メンバーを NSDMI を使用して初期化し、残りの非静的データ メンバーをコンストラクターを使用して初期化すると、コードの読みやすさが損なわれます。このようなコード パターンは、各データ メンバーで実際に使用される初期値について混乱を招く可能性があります。クラスのすべての非静的データ メンバーの初期化を NSDMI とコンストラクターのいずれかを使用して行うことにより、このような混乱の発生を避けられます。

移動コンストラクターとコピー コンストラクターはこのルールの適用対象外です。このようなコンストラクターではデータ メンバーの初期化で他のオブジェクトの既存の値を使用することによる特殊な動作が行われるからです。通常、これらのコンストラクターで混乱が起きることはありません。

Polyspace 実装

クラスの一部の非静的データ メンバーを NSDMI を使用して初期化し、残りの非静的データ メンバーをコンストラクターを使用して初期化すると、チェッカーはコンストラクター、および関連する NSDMI 初期化子にフラグを設定します。

チェッカーは、このルールに違反する移動コンストラクターとコピー コンストラクターに対してはフラグを設定しません。

トラブルシューティング

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

すべて展開する

#include <cstdint>
#include <utility>

class A
{
  public:
    A() : i1{0}, i2{0} // Compliant, i1 and i2 are initialized by the constructor only
    {
    }
	
  private:
    std::int32_t i1;
    std::int32_t i2;
};

class B
{
  private:
    std::int32_t i1{0};
    std::int32_t i2{0}; // Compliant, i1 and i2 are initialized by NSDMI only
};

class C
{
  public:
    C() : i2{0}   // Noncompliant, i1 is initialized by NSDMI, i2 is initialized by constructor
    {
    }

  private:
    std::int32_t i1{0};
    std::int32_t i2;
};

class D
{
    D(D const& oth) : i1{oth.i1}, i2{oth.i2} // Compliant by exception, copy constructor
    {
    }

    D(D&& oth): i1{std::move(oth.i1)}, i2{std::move(oth.i2)} 
    // Compliant by exception, move constructor
    {
    }

  private:
    std::int32_t i1{0};
    std::int32_t i2{0};
};

このコードでは、次の理由でクラス C のコンストラクターのみがこのコーディング ルールに準拠していません。

  • データ メンバー i1 は NSDMI を使用して初期化されている。

  • データ メンバー i2 はコンストラクターで初期化されている。

チェック情報

グループ: 特殊なメンバー関数
カテゴリ: Required、Automated

バージョン履歴

R2020b で導入

すべて展開する