C++11动态数组部分列表初始化(错误或误解)

C++ 11 Dynamic Array Partial List Initialization (Bug or Misunderstanding)?

本文关键字:错误 误解 初始化 动态 数组部 列表 C++11      更新时间:2023-10-16

我有以下C++11代码:

int *ipa = new int[5]{1, 2, 3};

我想我理解了元素3和4应该是初始化的值(在本例中为0)。在Visual C++2013中,这种情况正在发生。在Mingw 4.8.1中,情况并非如此;它们被默认初始化(即未初始化)。

我的问题是,这是一个已知的编译器(GCC或MingW)错误吗?我搜索了所有的bug列表(并在谷歌上搜索),但都是徒劳的。或者,我是否误解了应该发生的事情?

首先,如果您怀疑存在错误,那么报告它没有害处。下面是GCC错误zilla及其错误报告说明的链接。至少,您需要提供一个测试用例、操作系统和编译器版本。首先向SO报告它没有什么意义,因为您可以在这里阅读有关初始化的全部内容1


正确的行为是将其余元素初始化为0。引用C++11标准草案:

§5.3.4/15创建T类型对象的新表达式按如下方式初始化该对象:[…]

  • 否则,新初始值设定项将根据8.5的初始化规则进行解释,用于直接初始化

§8.5.4/3 T类型的对象或引用的列表初始化为定义如下:[…]

  • 否则,如果T是聚合,则执行聚合初始化(8.5.1)

[…]

  • 否则,如果初始值设定项列表没有元素,则对象被值初始化

§8.5.1/7如果列表中的初始值设定项子句少于聚合中有个成员,则每个成员都不是显式的initialized应从空的初始化器列表中初始化(8.5.4).

§8.5/5对于零初始化T类型的对象或引用意味着:

  • 如果T是标量类型(3.9),则将对象设置为值0(零),作为积分常量表达式,并将其转换为T103[…]

§8.5/7对于值初始化类型为T的对象意味着:[…]

  • 如果T是数组类型,则每个元素都被值初始化;

  • 否则,对象初始化为零。

1我已经启动了一个名为"我们需要一个关于C++初始化的规范问题吗?"的元线程?以解决先前在初始化问题方面缺乏研究的问题

编译器将初始化3和4元素为0。

在c++11中,支持这个表达式。

因此,您可以初始化数组(int或char…),如:int a[10] = {0};