Phi*_*ler 12 c++ constructor initialization operator-precedence ctor-initializer
因此,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();
}
};
Run Code Online (Sandbox Code Playgroud)
显然,重新排序ints和doubles声明中的内容并不是一件大事,但更大的对象和需要动态分配的东西有时也可以.
Joh*_*itb 21
C++标准12.6.2/3:
在每个基础和成员初始化之后有一个序列点(1.9).mem-initializer的表达式列表被评估为相应基础或成员的初始化的一部分.
初始化的顺序是您在问题中指定的顺序.评估是此初始化的一部分,初始化不能交错(因为它们之间存在序列点).
这意味着初始化程序列表中的函数调用不会按所需顺序调用,而是按成员声明的显示顺序调用.
| 归档时间: |
|
| 查看次数: |
1648 次 |
| 最近记录: |