初始值设定项列表*参数*计算顺序 这样,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(); } };

初始值设定项列表*参数*计算顺序 这样,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(); } };,c++,constructor,initialization,operator-precedence,ctor-initializer,C++,Constructor,Initialization,Operator Precedence,Ctor Initializer,显然,在声明中重新排序像int和double这样的东西并不是什么大问题,但更大的对象和需要动态分配的东西有时可能是这样。C++标准12.6.2/3: 每个基和成员初始化后都有一个序列点(1.9)。mem初始值设定项的表达式列表作为相应基或成员初始化的一部分进行计算 初始化的顺序是您在问题中指定的顺序。求值是初始化的一部分,初始化不能交错(因为它们之间有一个序列点) 这意味着初始值设定项列表中的函数调用不是按所需顺序调用的,而是按成员声明出现的顺序调用的 你能添加一个到源的链接吗?谢谢。如果我误读

显然,在声明中重新排序像
int
double
这样的东西并不是什么大问题,但更大的对象和需要动态分配的东西有时可能是这样。

C++标准
12.6.2/3

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

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


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

你能添加一个到源的链接吗?谢谢。如果我误读了,很抱歉,但是关于成员构造函数在各自初始化中参数的求值顺序的问题不是吗?哪个应该是未定义的?嗯,可能不是,因为分别只有一个参数。是的,成员构造函数的参数的求值顺序未指定,并且它们之间没有序列点@Jon Seigel,该标准尚未公开。但是在1998年的一份公开草案中有一个
12.6.2
:注意,在C++0x中,不再有序列点。但是,C++0x只是强调每个成员/基初始化构成一个完整表达式(隐式构造函数调用),初始化中出现的表达式与该完整表达式相关联。(C++0x中完整表达式中的每个求值都在下一个要求值的完整表达式之前排序,这将禁止同样的交错)。因此,如果你在C++0x草稿中查看,你会发现不同的措词:)我首先没有注意到顺序是不同的,呵呵:)