【发布时间】:2014-04-09 14:24:23
【问题描述】:
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_values 会默认初始化该数组。由于数组的元素是标量,我预计这意味着值都设置为 0。
在 C++11 中,似乎不再保证会发生这种情况。但是,正如 Mooing Duck 在 cmets 中指出的那样,也许这不再是默认初始化的情况,而是保留了预期行为的其他形式。欢迎引用。
【问题讨论】:
-
对象未初始化。所以,它们是未初始化的对象。
-
@Victor:他知道。他的观点是,从初始化到未初始化的变化是一个突破性的变化。
-
我记得听说 C++03 没有“值初始化”、“默认初始化”和“零初始化”之类的。是否有可能以前默认初始化的东西现在初始化为零,这使得这成为一个不破坏性的变化?
-
m_values应该是值初始化的,因为它是带有空括号的成员初始化器列表的一部分。
标签: c++ c++11 initialization language-lawyer c++-faq