Share via


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.