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.