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

时间:2015-03-27 00:36:42

标签: c++ c++11 initialization new-operator

我有以下C ++ 11代码:

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

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

我的问题是,这是一个已知的编译器(GCC或MingW)错误吗?我徒劳地搜索了所有错误列表(和谷歌搜索)。或者,我是否以某种方式误解了应该发生的事情?

2 个答案:

答案 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};