編譯器警告 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;
};
若要修正此問題,請排列初始化表達式清單,以擁有與宣告相同的順序。 當一或兩個初始設定式參考基底類別成員時,就會引發類似的警告。