C++ 默认初始化的含义在C++;11?

C++ 默认初始化的含义在C++;11?,c++,c++11,initialization,language-lawyer,c++-faq,C++,C++11,Initialization,Language Lawyer,C++ Faq,C++2003 8.5/5说: 默认初始化T类型的对象意味着: -如果T是非POD类类型(第9条),则调用T的默认构造函数(初始化为 如果T没有可访问的默认构造函数,则格式错误) -如果T是数组类型,则每个元素默认初始化 -否则,对象将初始化为零 [增加重点。] C++2011标准将最后一项更改为 -否则,不执行初始化 这似乎对某些程序来说是一个突破性的改变。这是故意的吗 编辑 下面是一些激发这个问题的代码: class Foo { public: Foo() : m_values(

C++2003 8.5/5说:

默认初始化T类型的对象意味着:

-如果T是非POD类类型(第9条),则调用T的默认构造函数(初始化为 如果T没有可访问的默认构造函数,则格式错误)

-如果T是数组类型,则每个元素默认初始化

-否则,对象将初始化为零

[增加重点。]

C++2011标准将最后一项更改为

-否则,不执行初始化

这似乎对某些程序来说是一个突破性的改变。这是故意的吗

编辑

下面是一些激发这个问题的代码:

class Foo {
  public:
    Foo() : m_values() {}

    int m_values[3];
};
在C++11之前,我认为在默认构造函数中明确提到
m_值将默认初始化该数组。由于数组的元素是标量的,我希望这意味着所有值都设置为0


在C++11中,似乎不再保证会发生这种情况。但是,正如Moing Duck在评论中指出的那样,也许这不再是默认初始化的情况,而是保留预期行为的其他形式。欢迎引用。

最终效果几乎相同。在C++03中,默认初始化的使用仅限于非POD类类型,因此最后一点从未应用。在C++11中,该标准通过消除使用默认初始化的条件简化了措辞,并更改了默认初始化的定义,以涵盖所有情况,从而符合之前发生的情况。

根据(因为它使用了比标准更友好的语言):

默认初始化在三种情况下执行:

3) 当基类或非静态数据成员未在 构造函数初始值设定项列表,并调用该构造函数

值初始化在三种情况下执行:

3,7)初始化非静态数据成员或基类时 使用带有一对空括号的成员初始值设定项
或大括号(从C++11开始)

请注意,C++11部分属于
或大括号,而不是整个段落

以及:

初始化T类型对象的值意味着:
-如果T是数组类型,则每个元素都初始化为值
-否则,对象初始化为零


因此,在C++11中,默认初始化不是零初始化成员,而是值初始化。严格来说,默认初始化的定义已从C++03更改为C++11。但我们还必须考虑到,当对象“默认-初始化”更改时的情况:

§8.5p9 C++03规定:

如果没有为对象指定初始值设定项,并且该对象是(可能是cv限定的)非POD类类型(或其数组),则该对象应默认初始化;如果对象是const限定类型,则基础类类型应具有用户声明的默认构造函数。否则,如果未为非静态对象指定初始值设定项,则该对象及其子对象(如果有)具有不确定的初始值;如果对象或其任何子对象为常量限定类型,则程序的格式不正确

§8.5p11 C++11规定:

如果没有为对象指定初始值设定项,则该对象默认为已初始化;如果未执行初始化,则具有自动或动态存储持续时间的对象具有不确定值

正如@JamesKanze已经指出的,当没有为非POD类类型的对象指定初始值设定项时,默认初始化是在C++03中执行的。在C++11中,如果未指定初始值设定项,则对象(任意类型)默认初始化。由于此更改,还必须更改默认初始化的定义,以便与C++03兼容



您的示例与默认初始化无关。初始化器为空括号集的对象总是初始化值。

对象未初始化。所以,它们是未初始化的对象。@Victor:他知道。他的观点是,从初始化到未初始化的更改是一个突破性的更改。我记得听说C++03没有“值初始化”与“默认初始化”与“零初始化”之类的内容。是否有可能以前默认初始化的内容现在已初始化为零,这使得这成为一个非破坏性的更改?
m_values
应该进行值初始化,因为它是带有空括号的成员初始值设定项列表的一部分。具体来说,C++03 8.5/9:如果没有为对象指定初始值设定项,并且该对象是(可能是cv限定的)非POD类类型(或其数组),该对象应默认初始化;如果对象是const限定类型,则基础类类型应具有用户声明的默认构造函数。否则,如果未为非静态对象指定初始值设定项,则该对象及其子对象(如果有)具有不确定的初始值;如果对象或其任何子对象的类型为常量限定类型,则程序的格式不正确。C++11 8.5/11:如果没有为对象指定初始值设定项,则该对象默认已初始化;如果未执行初始化,则具有自动或动态存储持续时间的对象具有不确定值。我不太明白这个答案。您是说,由于示例中的
m_值
数组是POD,因此默认初始化从未应用,即使在C++03中也没有应用?你能澄清一下吗?如果我像上面所示构造一个
Foo
,那么
m_values
中的值是0还是不确定?@JamesKanze:你的答案对很多人来说都很有用,但我仍然有我之前评论中的问题。如果y