Подтвердить что ты не робот

Инициализационный список * аргумент * порядок оценки

Итак, стандарт С++ требует, чтобы члены класса были инициализированы в том порядке, в котором они объявлены в классе, а не в том порядке, в котором они упоминаются в любом списке инициализаторов конструктора. Однако это не означает ничего о порядке, в котором оцениваются аргументы этих инициализаций. Я работаю с системой, которая часто передает ссылки на объекты сериализации вокруг и задается вопросом, могу ли я гарантировать, что биты считываются из нее в правильном порядке, независимо от порядка, в котором эти биты записываются в поля объекта.

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 в объявлении, не является слишком большой сделкой, но иногда могут быть большие объекты и вещи, требующие динамического выделения.

4b9b3361

Ответ 1

Стандарт С++ 12.6.2/3:

После инициализации каждой базы и члена существует точка последовательности (1.9). Список выражений mem-инициализатора оценивается как часть инициализации соответствующей базы или члена.

Порядок инициализации - это тот, который вы задали в вопросе. Оценка является частью этой инициализации, и инициализации не могут чередоваться (потому что между ними есть точка последовательности).

Это означает, что вызовы функций в ваших списках инициализатора не вызывают в желаемом порядке, а в том порядке, в котором появляются объявления участников.