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

use*_*569 9 c++ initialization new-operator c++11

我有以下C++ 11代码:

int *ipa = new int[5]{1, 2, 3};
Run Code Online (Sandbox Code Playgroud)

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

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

小智 1

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

\n\n
\n\n

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

\n\n
\n

\xc2\xa75.3.4/15 一个新表达式创建 T\n 类型对象的

\n\n
    \n
  • 否则,新的初始化程序将根据 8.5 的直接初始化规则进行解释。
  • \n
\n\n

\xc2\xa78.5.4/3 对象或类型引用的列表初始化T定义如下:[...]

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

[...]

\n\n
    \n
  • 否则,如果初始值设定项列表没有元素,则对该对象进行值初始化。
  • \n
\n\n

\xc2\xa78.5.1/7 如果初始化子句较少列表中的少于聚合中的成员,则每个未显式初始化的成员应从空初始化器列表初始化\n (8.5.4 )。

\n\n

\xc2\xa78.5/5 对类型的对象或引用进行零初始化T意味着:

\n\n
    \n
  • 如果T是标量类型(3.9),则将对象设置为值 0(零),作为整型常量表达式,转换为\n T;103 [...]
  • \n
\n\n

\xc2\xa78.5/7 对type 的对象进行值初始化T意味着:[...]

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

  • \n
  • 否则,该对象将被零初始化。

  • \n
\n
\n\n

1 我已经启动了一个名为“我们需要有关 C++ 初始化的规范问题吗?”的元线程。解决初始化问题缺乏先前研究的问题。

\n