Итак, стандарт С++ требует, чтобы члены класса были инициализированы в том порядке, в котором они объявлены в классе, а не в том порядке, в котором они упоминаются в любом списке инициализаторов конструктора. Однако это не означает ничего о порядке, в котором оцениваются аргументы этих инициализаций. Я работаю с системой, которая часто передает ссылки на объекты сериализации вокруг и задается вопросом, могу ли я гарантировать, что биты считываются из нее в правильном порядке, независимо от порядка, в котором эти биты записываются в поля объекта.
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
в объявлении, не является слишком большой сделкой, но иногда могут быть большие объекты и вещи, требующие динамического выделения.