int * array = new int [size]()的有效性;

时间:2009-11-17 20:00:54

标签: c++ compiler-construction g++ standards

int * array = new int [size]();

operator()允许将数组的所有值设置为0(所有位都为0)。它被称为值初始化。

哪个版本的g ++有效?

其他编译器怎么样?

我在哪里可以找到它的标准?

3 个答案:

答案 0 :(得分:6)

这是C ++标准的一部分;如果它在g ++中无效,那么g ++是不合格的。根据C ++标准(ISO / IEC 14882:2003),有几个部分是相关的:

关于新表达的

5.3.4 / 15说:

  

如果new-initializer的格式为(),则该项为值初始化

8.5 / 5关于初始化者说:

  

对T类型的对象进行值初始化意味着:

     

- 如果T是具有用户声明的构造函数(12.1)的类类型(第9节),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的); < / p>      

- 如果T是没有用户声明的构造函数的非联合类类型,则T的每个非静态数据成员和基类组件都是值初始化的;

     

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

     

- 否则,该对象为零初始化

因此,对于一个标量类型的int数组,第三个和第四个项目符号适用。

答案 1 :(得分:1)

使用()初始化(包括您的示例)始终是标准C ++的一部分,因为C ++ 98。虽然标准的较新版本有一些变化,但它们并不适用于您的示例。

众所周知,GCC编译器会在2.x.x系列的版本中错误地处理()初始值设定项。已知MSVC ++编译器在VC6中错误地处理()初始值设定项。较新版本的MSVC ++根据C ++ 98规范处理()初始值设定项。

答案 2 :(得分:0)

这是来自“编程标准的工作草案” 语言C ++“日期为2009-11-09:

8.5初始化程序
...
7对T类型的对象进行值初始化意味着:

  • 如果T是具有用户提供的构造函数(12.1)的(可能是cv限定的)类类型(第9节),那么 调用T的默认构造函数(如果T没有可访问的默认值,则初始化是错误的 构造函数);
  • 如果T是一个(可能是cv限定的)非联合类类型而没有用户提供的构造函数,那么该对象 是零初始化,如果T的隐式声明的默认构造函数是非平凡的,那么构造函数是 调用。
  • 如果T是数组类型,则每个元素都是值初始化的;
  • 否则,对象是零初始化的。

...