Upozornění kompilátoru C5038
datový člen member 'member1' bude inicializován po členu dat 'member2'
datový člen member 'member' se inicializuje po základní třídě "base_class"
Poznámky
Členové třídy se inicializují v pořadí, v jakém jsou deklarovány, nikoli v pořadí, ve kterém se zobrazují v seznamech inicializátorů. Kompilátor varuje, když pořadí inicializace není stejné jako pořadí deklarace datových členů nebo základních tříd. Pořadí může vést k nedefinovanému chování modulu runtime: například pokud inicializace jednoho člena v seznamu závisí na inicializaci člena, který je deklarován později.
Toto upozornění je nové v sadě Visual Studio 2017 verze 15.3 a je ve výchozím nastavení vypnuté. Umožňuje /Wall
povolit všechna upozornění, která jsou ve výchozím nastavení vypnutá, nebo /w15038
povolit C5038 jako upozornění úrovně 1. Další informace najdete v tématu Upozornění kompilátoru, která jsou ve výchozím nastavení vypnutá. Informace o tom, jak zakázat upozornění podle verze kompilátoru, naleznete v tématu Upozornění kompilátoru podle verze kompilátoru.
Příklad
V následujícím příkladu kompilátor (při použití /w15038) vyvolá upozornění C5038: datový člen A::y se inicializuje za datovým členem 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;
};
Pokud chcete tento problém vyřešit, uspořádejte seznam inicializátorů tak, aby měl stejné pořadí jako deklarace. Podobné upozornění se vyvolá, když jeden nebo oba inicializátory odkazují na členy základní třídy.
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro