值初始化是C ++ 98标准的一部分吗?如果没有,为什么它被添加到C ++ 03标准中?

时间:2014-12-08 00:38:03

标签: c++ language-lawyer c++03 c++98 value-initialization

干杯和hth。 - Alf在这个answer中发表评论,与C ++ 98相比,值初始化可以说是C ++ 03的一个新特性。我不知道他的意思。

{+ 3}}是C ++ 98的一部分吗?它是出现在概念中而不是名义上吗?为什么它被添加到C ++ 03标准中?

我有一份 03标准的副本,但没有' 98标准。这是默认初始化和值初始化的定义。

  

默认初始化T类型的对象意味着:

     

- 如果T是非POD类类型(第9节),则为默认构造函数   调用T(如果T没有,则初始化是错误的   access default constructor);

     

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

     

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

     

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

     

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

     

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

     

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

     

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

我的猜测是' 98具有默认初始化但没有值初始化,并且两者之间存在一些关键差异。说实话,我在解析这里的标准时遇到了困难,我不明白这些定义之间的区别。

1 个答案:

答案 0 :(得分:10)

引用the ISO/IEC 14882:1998 standard document(已从ISO撤回):

  

默认初始化 T类型的对象意味着:

     
      
  • 如果T是非POD类类型(第9节),则调用T的默认构造函数(如果T没有,则初始化不正确   access default constructor);
  •   
  • 如果T是数组类型,则每个元素都是默认初始化的;
  •   
  • 否则,对象的存储空间为零。
  •   

在第7段:

  

一个对象,其初始化程序是一组空的括号,即(),应默认初始化。

有关变更背后的基本原理的详细信息可以在the defect report中找到:

  

此定义适用于局部变量,但不适用于   由于执行表达式而初始化的对象   形式T(),因为这些表达式产生的对象会   立即复制,因此应具有值   保证可以复制。
为此,我建议加入   按照8.5的新案文,第5段:

     

value-initialize T类型的对象意味着:

     
      
  • 如果T是具有用户声明的构造函数(12.1)的类类型(子句9 [class]),则调用T的默认构造函数(和   如果T没有可访问的默认值,则初始化是错误的   构造函数);
  •   
  • 如果T是没有用户声明的构造函数的类类型,那么T的每个非静态数据成员和基类组件都是   值初始化;
  •   
  • 如果T是数组类型,则每个元素都是值初始化的;
  •   
  • 否则,对象的存储空间为零。
  •   
     

此外,我建议将''default-initialization''更改为   5.2.3第2段中的“价值初始化”。

然后,这是一个历史性的解释:

  

古代历史

     

曾几何时,一位名叫Laura Eaves的AT& T编译器开发人员问道   我:''int()的价值应该是什么?''我的第一个想法就是这样   在说出

之后,它应该与x具有相同的值
int x;
     

但我很快就意识到这个定义是行不通的。原因是   x具有不确定的值(假设它是本地的   变量),但我们不介意x是不确定的,因为我们是   可能会在我们使用它之前为x分配一个值。相反,   int()最好没有不确定的价值,因为复制   这样的值具有不确定的效果。禁止a是愚蠢的   编译期间标记int()的编译器,只允许它   在执行期间标记它! [...]