Compartir vía


Advertencia del compilador C5038

el miembro de datos "member1" se inicializará después del miembro de datos "member2"
el miembro de datos "member" se inicializará después de la clase base "base_class"

Comentarios

Los miembros de clase se inicializan en el orden en que se declaran, no en el orden en que aparecen en las listas de inicializadores. El compilador advierte cuando el orden de inicialización no es el mismo que el orden de declaración de los miembros de datos o las clases base. El orden puede provocar un comportamiento en tiempo de ejecución no definido; por ejemplo, si la inicialización de un miembro de la lista depende de la inicialización de un miembro que se declara más adelante.

Esta advertencia es nueva en la versión 15.3 de Visual Studio 2017 y está desactivada de manera predeterminada. Use /Wall para habilitar todas las advertencias que están desactivadas de manera predeterminada o /w15038 para habilitar C5038 como advertencia de nivel 1. Para más información, consulte Advertencias del compilador desactivadas de manera predeterminada. Para información sobre cómo deshabilitar las advertencias por versión del compilador, consulte Advertencias del compilador por versión del compilador.

Ejemplo

En el ejemplo siguiente, el compilador (cuando se usa /w15038) genera la advertencia C5038, que indica que el miembro de datos "A::y" se inicializará después del miembro de datos "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 corregir este problema, organice la lista de inicializadores de manera que tenga el mismo orden que las declaraciones. Cuando uno o ambos inicializadores hacen referencia a miembros de clase base, se genera una advertencia similar.