编译器警告 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;
};

要修复此问题,请将初始值设定项列表的顺序设置为与声明顺序相同。 如果一个或两个初始化表达式同时引用基类成员,则会引发类似警告。