Compilerwarnung C5038
"member1" wird nach dem Datenmemm "member2" initialisiert.
"member" wird nach der Basisklasse "base_class" initialisiert.
Hinweise
Klassenmember werden in der Reihenfolge initialisiert, in der sie deklariert sind, nicht in der Reihenfolge, in der Sie in Initialisiererlisten angezeigt werden. Der Compiler warnt, wenn die Initialisierungsreihenfolge nicht mit der Deklarationsreihenfolge von Datenmmbern oder Basisklassen übereinstimmt. Die Reihenfolge kann zu einem nicht definierten Laufzeitverhalten führen: Wenn beispielsweise die Initialisierung eines Elements in der Liste von der Initialisierung eines Später deklarierten Elements abhängt.
Diese Warnung ist neu in Visual Studio 2017, Version 15.3, und standardmäßig deaktiviert. Wird verwendet /Wall
, um alle Standardmäßig deaktivierten Warnungen zu aktivieren oder /w15038
C5038 als Warnung der Ebene 1 zu aktivieren. Weitere Informationen finden Sie unter Compilerwarnungen, die standardmäßig deaktiviert sind. Informationen zum Deaktivieren von Warnungen nach Compilerversion finden Sie unter Compilerwarnungen nach Compilerversion.
Beispiel
Im folgenden Beispiel löst der Compiler (bei Verwendung von /w15038) "Warnung C5038 aus: Das Datenmemm 'A::y' wird nach dem Datenmemm 'A::x'" initialisiert:
// 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;
};
Um dieses Problem zu beheben, ordnen Sie die Initialisierungsliste so an, dass sie die gleiche Reihenfolge wie die Deklarationen hat. Eine ähnliche Warnung wird ausgelöst, wenn ein oder beide Initialisierer auf Member der Basisklasse verweisen.