繁体   English   中英

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

[英]Validity of int * array = new int [size]();

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

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

由于哪个版本的g ++有效?

那么其他编译器呢?

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

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

关于新表达的5.3.4 / 15说:

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

8.5 / 5关于初始化者说:

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

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

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

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

- 否则,对象被零初始化

因此,对于一组标量类型的整数,第三和第四个要点适用。

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

已知GCC编译器在2.xx系列的版本中错误地处理()初始化器。 已知MSVC ++编译器在VC6中错误地处理()初始化器。 较新版本的MSVC ++ handle ()初始化程序符合C ++ 98规范。

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

8.5初始化器
...
7要初始化T类型的对象,意味着:

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

...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM