初始化列表*参数*评估顺序

Phi*_*ler 12 c++ constructor initialization operator-precedence ctor-initializer

因此,C++标准要求类成员按照它们在类中声明的顺序进行初始化,而不是在任何构造函数的初始化列表中提及它们的顺序.但是,这并不意味着评估这些初始化的参数的顺序.我正在使用一个经常传递对序列化对象的引用的系统,并想知道我是否可以确保以正确的顺序从中读取位,而不管这些位写入对象字段的顺序.

struct Foo {
    int a;
    double b;
    // I want to be able to do this
    Foo(SerObj &s)
    : b(s.readDouble()), a(s.readInt())
    { }
    // Rather than this
    Foo (SerObj &s)
    {
        b = s.readDouble();
        a = s.readInt();
    }
};
Run Code Online (Sandbox Code Playgroud)

显然,重新排序intsdoubles声明中的内容并不是一件大事,但更大的对象和需要动态分配的东西有时也可以.

Joh*_*itb 21

C++标准12.6.2/3:

在每个基础和成员初始化之后有一个序列点(1.9).mem-initializer的表达式列表被评估为相应基础或成员的初始化的一部分.

初始化的顺序是您在问题中指定的顺序.评估是此初始化的一部分,初始化不能交错(因为它们之间存在序列点).

这意味着初始化程序列表中的函数调用不会按所需顺序调用,而是按成员声明的显示顺序调用.

  • 请注意,在C++ 0x中,不再有序列点.但相反,C++ 0x只强调每个成员/基本初始化构成一个完整表达式(隐式构造函数调用),并且初始化中出现的表达式与该完整表达式相关联.(并且在下一个要评估的完整表达式之前,对C++ 0x中的完整表达式中的每个评估进行排序 - 这将同样禁止交错).所以如果你看一下C++ 0x草案,你会发现不同的措辞:) (4认同)