Share via


Avviso del compilatore C5038

il membro dati 'member1' verrà inizializzato dopo il membro dati 'member2'
il membro dati 'member' verrà inizializzato dopo la classe base 'base_class'

Osservazioni:

I membri della classe vengono inizializzati nell'ordine in cui sono dichiarati, non nell'ordine in cui vengono visualizzati negli elenchi di inizializzatori. Il compilatore avvisa quando l'ordine di inizializzazione non corrisponde all'ordine di dichiarazione dei membri dati o delle classi di base. L'ordine può portare a un comportamento di runtime non definito: ad esempio, se l'inizializzazione di un membro nell'elenco dipende dall'inizializzazione di un membro dichiarato in un secondo momento.

Questo avviso è una novità di Visual Studio 2017 versione 15.3 e disattivato per impostazione predefinita. Usare /Wall per abilitare tutti gli avvisi disattivati per impostazione predefinita o /w15038 per abilitare C5038 come avviso di livello 1. Per altre informazioni, vedere Avvisi del compilatore disattivati per impostazione predefinita. Per informazioni su come disabilitare gli avvisi in base alla versione del compilatore, vedere Avvisi del compilatore per versione del compilatore.

Esempio

Nell'esempio seguente il compilatore (quando si usa /w15038) genera "avviso C5038: il membro dati 'A::y' verrà inizializzato dopo il membro dati '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;
};

Per risolvere questo problema, disporre l'elenco di inizializzatori in modo che abbia lo stesso ordine delle dichiarazioni. Viene generato un avviso analogo quando uno o entrambi gli inizializzatori fanno riferimento a membri della classe di base.