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

C++2003 8.5/5 说:

C++2003 8.5/5 says:

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

To default-initialize an object of type T means:

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

― if T is a non-POD class type (clause 9), the default constructor for T is called (and the initialization is ill-formed if T has no accessible default constructor);

――如果 T 是一个数组类型,每个元素都是默认初始化的;

― if T is an array type, each element is default-initialized;

――否则,对象被零初始化.

[强调添加.]

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

The C++2011 standard changed that last item to

―否则,不执行初始化.

对于某些程序来说,这似乎是一个重大变化.这是故意的吗?

This seems like it would be a breaking change for some programs. Was this intentional?

编辑

这里有一些代码可以激发这个问题:

Here's some code to motivate this question:

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

    int m_values[3];
};

在 C++11 之前,我认为在默认构造函数中明确提及 m_values 会default-initialize 该数组.由于数组的元素是标量,我预计这意味着值都设置为 0.

Before C++11, I thought the explicit mention of m_values in the default constructor would default-initialize that array. And since the elements of the array are scalar, I expected that to mean the values were all set to 0.

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

In C++11, it seems there's no longer a guarantee that this will happen. But maybe, as Mooing Duck pointed out in the comments, perhaps this is no longer a case of default initialization but some other form which preserves the expected behavior. Citations welcome.

推荐答案

最终效果差不多.在 C++03 中,default-initialize 的使用仅限于非 POD 类类型,因此最后一点从未应用.在 C++11 中,该标准通过消除使用默认初始化的条件来简化措辞,并更改默认初始化的定义以涵盖所有情况,以对应之前发生的情况.

The final effects are almost the same. In C++03, the use of default-initialize was restricted to non-POD class type, so the last point never applied. In C++11, the standard simplifies the wording by eliminating the condition with regards to where default-initialization was used, and changes the definition of default-initialization to cover all of the cases in a way to correspond what happened before.

相关文章