14

因此,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();
    }
};

显然,在声明中重新排序像intsand这样的东西doubles并不是什么大不了的事,但有时需要动态分配的更大的对象和东西就可以了。

4

1 回答 1

23

C++ 标准12.6.2/3

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

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

这意味着初始化器列表中的函数调用不是按所需顺序调用的,而是按成员声明出现的顺序调用的。

于 2009-10-19T17:23:28.230 回答