Udostępnij za pośrednictwem


Ostrzeżenie kompilatora C5038

składowa danych "member1" zostanie zainicjowana po składowej danych "member2"
składowa danych "składowa" zostanie zainicjowana po klasie bazowej "base_class"

Uwagi

Składowe klasy są inicjowane w kolejności deklarowanej, a nie kolejności wyświetlanej na listach inicjatorów. Kompilator ostrzega, gdy kolejność inicjowania nie jest taka sama jak kolejność deklaracji składowych danych lub klas bazowych. Kolejność może prowadzić do niezdefiniowanego zachowania środowiska uruchomieniowego: na przykład jeśli inicjowanie jednego elementu członkowskiego na liście zależy od inicjowania elementu członkowskiego zadeklarowanego później.

To ostrzeżenie jest nowe w programie Visual Studio 2017 w wersji 15.3 i jest domyślnie wyłączone. Użyj /Wall polecenia , aby włączyć wszystkie ostrzeżenia wyłączone domyślnie lub /w15038 włączyć C5038 jako ostrzeżenie poziomu 1. Aby uzyskać więcej informacji, zobacz Ostrzeżenia kompilatora, które są domyślnie wyłączone. Aby uzyskać informacje na temat wyłączania ostrzeżeń według wersji kompilatora, zobacz Ostrzeżenia kompilatora według wersji kompilatora.

Przykład

W poniższym przykładzie kompilator (w przypadku użycia /w15038) zgłasza komunikat "ostrzeżenie C5038: składowa danych "A::y" zostanie zainicjowana po elemencie danych "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;
};

Aby rozwiązać ten problem, rozmieść listę inicjatorów, aby mieć taką samą kolejność jak deklaracje. Podobne ostrzeżenie jest zgłaszane, gdy jeden lub oba inicjatory odwołują się do składowych klasy bazowej.