-1

c++11 中的类成员什么时候获得默认值?下面的代码合法吗?

class C {
    void* buffer;
    uint16_t& crc = *reinterpret_cast <uint16_t*> (buffer);
public:
    explicit C (void* p) : buffer (p) {}
};

我希望 crc 的默认值只是语法糖,因此在缓冲区之后初始化 crc。我对么?

4

2 回答 2

3

非静态数据成员的初始化顺序在 12.6.2 Initializing bases and members [class.base.init] 的第 10 段中指定(强调我的):

在非委托构造函数中,初始化按以下顺序进行:

[...关于基地的事情]

— 然后,非静态数据成员按照它们在类定义中声明的顺序进行初始化(同样不管 mem-initializers 的顺序)。

— 最后,执行构造函数主体的复合语句。

如您所见,成员是使用所谓的mem-initializer(即在构造函数内部,在其主体之前)还是使用大括号或相等初始化器(即在类定义中)进行初始化,或者根本没有与初始化顺序有关。

于 2012-07-03T13:48:37.557 回答
1

顺序在 C++11 §12.6.2[class.base.init]/10 中指定。它仅取决于您声明数据成员的顺序。既然buffer出现之前crc就好了。

然后,非静态数据成员按照它们在类定义中声明的顺序进行初始化(同样不管mem-initializers的顺序)。

于 2012-07-03T13:47:20.523 回答