Avertissement du compilateur C5038

le membre de données 'member1' est initialisé après le membre de données 'member2'
le membre de données 'member' sera initialisé après la classe de base 'base_class'

Notes

Les membres de classe sont initialisés dans l’ordre suivant lequel ils sont déclarés, et non selon celui de leur apparition dans les listes d’initialiseurs. Le compilateur avertit lorsque l’ordre d’initialisation n’est pas identique à l’ordre de déclaration des membres de données ou des classes de base. L’ordre peut entraîner un comportement d’exécution non défini : par exemple, si l’initialisation d’un membre dans la liste dépend de l’initialisation d’un membre déclaré ultérieurement.

Cet avertissement est nouveau dans Visual Studio 2017 version 15.3 et est désactivé par défaut. Permet /Wall d’activer tous les avertissements désactivés par défaut ou /w15038 d’activer l’avertissement C5038 en tant qu’avertissement de niveau 1. Pour plus d’informations, consultez les avertissements du compilateur désactivés par défaut. Pour plus d’informations sur la désactivation des avertissements par version du compilateur, consultez avertissements du compilateur par version du compilateur.

Exemple

Dans l’exemple suivant, le compilateur (lors de l’utilisation de /w15038) déclenche « avertissement C5038 : le membre de données « A ::y » est initialisé après le membre de données « 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;
};

Pour résoudre ce problème, organisez la liste d’initialiseurs pour avoir le même ordre que les déclarations. Un avertissement similaire est déclenché lorsqu’un ou les deux initialiseurs se réfèrent aux membres de classe de base.