代码之家  ›  专栏  ›  技术社区  ›  Phil Miller

初始值设定项列表*参数*计算顺序

  •  12
  • Phil Miller  · 技术社区  · 15 年前

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

    显然,重新排序 ints doubles 在声明中不是太大的事情,但有时需要动态分配的更大的对象和事物可以是。

    1 回复  |  直到 10 年前
        1
  •  21
  •   Johannes Schaub - litb    15 年前

    C++标准 12.6.2/3 :

    在每个基和成员初始化之后有一个序列点(1.9)。mem初始值设定项的表达式列表作为相应基或成员初始化的一部分进行计算。

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

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