类成员什么时候在c ++ 11中获取默认值?以下代码是否合法?
class C {
void* buffer;
uint16_t& crc = *reinterpret_cast <uint16_t*> (buffer);
public:
explicit C (void* p) : buffer (p) {}
};
我希望,crc的默认值只是语法糖,所以crc在缓冲区之后被初始化。我是对的吗?
答案 0 :(得分:3)
非静态数据成员的初始化顺序在12.6.2初始化基础和成员[class.base.init]的第10段中规定。 (强调我的):
在非委托构造函数中,初始化按以下顺序进行:
[......关于基地的事情]
- 然后,按照在类定义中声明的顺序初始化非静态数据成员 (再次与mem-initializers的顺序无关)。
- 最后,执行构造函数体的复合语句。
正如您所看到的,是否使用所谓的 mem-initializer (即在构造函数内部,在其正文之前)或大括号或等于初始化程序<来初始化成员< / em>(即在类定义中)或者根本没有任何内容与初始化顺序无关。
答案 1 :(得分:1)
订单在C ++11§12.6.2[class.base.init] / 10中指定。它仅取决于您声明数据成员的顺序。由于buffer
出现在crc
之前,所以很好。
然后,非静态数据成员按照它们在类定义中声明的顺序进行初始化(同样不管 mem-initializers 的顺序如何)。