我有以下C ++ 11代码:
int *ipa = new int[5]{1, 2, 3};
我认为我理解元素3和4应该是值(在这种情况下为0)初始化。在Visual C ++ 2013中,正在发生这种情况。在Mingw 4.8.1中它不是;它们被默认初始化(即未初始化)。
我的问题是,这是一个已知的编译器(GCC或MingW)错误吗?我徒劳地搜索了所有错误列表(和谷歌搜索)。或者,我是否以某种方式误解了应该发生的事情?
答案 0 :(得分:1)
首先,如果您怀疑存在错误,那么报告它是没有害处的。这是指向GCC bugzilla及其bug reporting instructions的链接。至少,您需要提供测试用例以及编译器的操作系统和版本。首先向SO报告它的目的很少,因为您可以阅读all about initialization here。 1
正确的行为是将剩余的元素初始化为0.引用C ++ 11草案标准:
§5.3.4/ 15一个 new-expression ,它创建一个T类型的对象 按如下方式初始化该对象:[...]
- 否则, new-initializer 将根据8.5的初始化规则进行解释,以进行直接初始化。
§8.5.4/ 3类型
T
的对象或引用的列表初始化是 定义如下:[...]
- 否则,如果
T
是聚合,则执行聚合初始化(8.5.1)。[...]
- 否则,如果初始化列表没有元素,则对象将进行值初始化。
§8.5.1/ 7如果列表中的 initializer-clauses 少于 聚合中有成员,然后每个成员没有明确 初始化应从空的初始化列表初始化 (8.5.4)。
§8.5/ 5 零初始化
T
类型的对象或引用意味着:
- 如果
T
是标量类型(3.9),则将对象设置为值0(零),作为整数常量表达式,转换为 T; 103 [...]§8.5/ 7 value-initialize
T
类型的对象意味着:[...]
如果
T
是数组类型,则每个元素都是值初始化的;否则,该对象为零初始化。
1我已经开始了一个名为Do we need a canonical question about C++ initialization?的元线程来解决初始化问题中缺乏先前研究的问题。
答案 1 :(得分:0)
编译器会将3和4元素初始化为0。
在c ++ 11中支持这个表达式。
这样,您可以初始化数组(int或char ...),如:int a[10] = {0};