Aviso do compilador C5038

o membro de dados 'member1' será inicializado após o membro de dados 'member2'
o membro de dados 'membro' será inicializado após a classe base 'base_class'

Comentários

Os membros de classe são inicializados na ordem em que são declarados e não na ordem em que aparecem em listas de inicializadores. O compilador avisa quando a ordem de inicialização não é a mesma que a ordem de declaração de membros de dados ou classes base. A ordem pode levar a um comportamento de runtime indefinido: por exemplo, se a inicialização de um membro na lista depender da inicialização de um membro declarado posteriormente.

Esse aviso é novo no Visual Studio 2017 versão 15.3 e está desativado por padrão. Use /Wall para habilitar todos os avisos que estão desativados por padrão, ou /w15038 para habilitar C5038 como um aviso de nível 1. Para obter mais informações, confira Avisos do compilador desativados por padrão. Para obter informações sobre como desabilitar avisos por versão do compilador, consulte Avisos do compilador por versão do compilador.

Exemplo

No exemplo a seguir, o compilador (ao usar /w15038) aciona o "aviso C5038: o membro de dados 'A::y' será inicializado após o membro de dados '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;
};

Para corrigir o problema, organize a lista do inicializador para que tenha a mesma ordem das declarações. Um aviso semelhante é gerado quando um ou ambos os inicializadores fazem referência a membros de classe base.