Share via


コンパイラの警告 C5038

データ メンバー 'member1' は、データ メンバー 'member2' の後に初期化されます
データメンバー 'member' は基底クラス 'base_class' の後に初期化されます

解説

クラス メンバーは、初期化子リストに表示される順序ではなく、宣言される順序で初期化されます。 初期化の順序がデータ メンバーまたは基底クラスの宣言の順序と同じでない場合、コンパイラは警告を出します。 順序は、未定義の実行時動作につながる可能性があります。たとえば、リスト内のあるメンバーの初期化が、それよりも後に宣言されるメンバーの初期化に依存している場合などが該当します。

この警告は Visual Studio 2017 バージョン 15.3 で新たに追加されたものであり、既定では無効になっています。 既定でオフになっているすべての警告を有効にするには /Wall を、C5038 をレベル 1 の警告として有効にするには /w15038 を使用します。 詳細については、「既定で無効になっているコンパイラ警告」を参照してください。 コンパイラのバージョン別の警告を無効にする方法は、「コンパイラのバージョン別のコンパイラの警告」を参照してください。

次の例では、(/w15038 を使用すると) コンパイラから "警告 C5038: データ メンバー 'A::x' の後にデータ メンバー 'A::y' が初期化されます" という警告が出されます。

// C5038.cpp
// Compile using: cl /EHsc /c /w15038 C5038.cpp
struct A
{
    A(int a) : y(a), x(y) {} // C5038, Initialized in reverse, y reused
    int x;
    int y;
};

この問題を解決するには、宣言と同じ順序になるように初期化子リストを整列します。 初期化子のいずれかまたは両方で基底クラス メンバーが参照される場合に同様の警告が発生します。