在C++ 11中更改了默认初始化的含义?

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中,该标准通过消除使用默认初始化的条件来简化措辞,并更改默认初始化的定义以覆盖所有情况,以对应之前发生的事情.

  • 我不太明白这个答案.你是说因为示例中的`m_values`数组是POD,默认初始化从未应用过,甚至在C++ 03中都没有?你能澄清一下吗?如果我构造一个如上所示的`Foo`,`m_values`中的值是0还是不确定? (2认同)
  • @JamesKanze:你的回答看起来很有帮助,但我仍然有我之前的评论.如果你能清除它们,我很乐意接受它. (2认同)