Поделиться через


Предупреждение компилятора C5038

Член данных "member1" будет инициализирован после элемента данных "member2"
Член данных "member" будет инициализирован после базового класса "base_class"

Замечания

Элементы класса инициализируются в порядке их объявления, а не в порядке отображения в списках инициализаторов. Компилятор предупреждает, что порядок инициализации не совпадает с порядком объявления членов данных или базовых классов. Порядок может привести к неопределенному поведению среды выполнения: например, если инициализация одного члена в списке зависит от инициализации элемента, объявленного позже.

Это предупреждение новое в Visual Studio 2017 версии 15.3 и по умолчанию отключено. Используйте /Wall для включения всех предупреждений, отключенных по умолчанию, или /w15038 для включения C5038 в качестве предупреждения уровня 1. Дополнительные сведения см. в разделе "Предупреждения компилятора", отключенные по умолчанию. Сведения об отключении предупреждений по версии компилятора см. в предупреждениях компилятора по версии компилятора.

Пример

В следующем примере компилятор (при использовании /w15038) вызывает "предупреждение C5038: элемент данных "A::y" будет инициализирован после элемента данных "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;
};

Чтобы устранить эту проблему, упорядочение списка инициализатора должно иметь тот же порядок, что и объявления. Похожее предупреждение возникает, когда один инициализатор или оба ссылаются на члены базового класса.