我有以下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};