Adr*_*thy 34 c++ initialization c++-faq language-lawyer c++11
C++ 2003 8.5/5说:
到缺省初始化类型的对象T表示:
- 如果T是非POD类类型(第9节),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的);
- 如果T是数组类型,则每个元素都是默认初始化的;
- 否则,对象被零初始化.
[重点补充.]
C++ 2011标准将最后一项更改为
- 否则,不执行初始化.
对于某些程序来说,这似乎是一个突破性的变化.这是故意的吗?
编辑
以下是一些激励这个问题的代码:
class Foo {
public:
Foo() : m_values() {}
int m_values[3];
};
Run Code Online (Sandbox Code Playgroud)
在C++ 11之前,我认为m_values在默认构造函数中明确提到将默认初始化该数组.由于数组的元素是标量,我预计这意味着值都被设置为0.
在C++ 11中,似乎不再保证会发生这种情况.但也许正如Mooing Duck在评论中指出的那样,也许这不再是默认初始化的情况,而是一些保留预期行为的其他形式.引文欢迎.
Jam*_*nze 22
最终效果几乎相同.在C++ 03中,default-initialize的使用仅限于非POD类类型,因此最后一个点从未应用过.在C++ 11中,该标准通过消除使用默认初始化的条件来简化措辞,并更改默认初始化的定义以覆盖所有情况,以对应之前发生的事情.