編譯器警告 C5038

資料成員 'member1 ' 將在資料成員 ' member2 ' 之後初始化
資料成員 'member ' 將在基類 ' base_class ' 之後初始化

備註

類別成員會依照宣告的順序初始化,而不是它們出現在初始化運算式清單中的順序。 編譯器會在初始化順序與資料成員或基類的宣告順序不同時發出警告。 順序可能會導致未定義的執行時間行為:例如,如果清單中一個成員的初始化取決於稍後宣告的成員初始化。

此警告是 Visual Studio 2017 15.3 版的新功能,且預設為關閉。 使用 /Wall 來啟用預設關閉的所有警告,或 /w15038 啟用 C5038 作為層級 1 警告。 如需詳細資訊,請參閱 預設 關閉的編譯器警告。 如需如何依編譯器版本停用警告的資訊,請參閱 編譯器版本的 編譯器警告。

範例

在下列範例中,編譯器 (使用 /w15038) 會引發 「warning C5038: data member 'A::y' will initialized after data member 'A::x'」:

// 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;
};

若要修正此問題,請排列初始化運算式清單,以擁有與宣告相同的順序。 當一或兩個初始設定式參考基底類別成員時,就會引發類似的警告。