Предупреждение компилятора 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;
};
Чтобы устранить эту проблему, упорядочение списка инициализатора должно иметь тот же порядок, что и объявления. Похожее предупреждение возникает, когда один инициализатор или оба ссылаются на члены базового класса.