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

Is value initialization part of the C++98 standard? If not, why was it added in the C++03 standard?

本文关键字:标准 为什么 C++03 添加 C++98 初始化 一部分 如果不      更新时间:2023-10-16

干杯和hth。 - Alf 在此答案中评论说,与 C++98 相比,值初始化可以说是 C++03 的新功能。我想知道他是什么意思。

值初始化是 C++98 的一部分吗?它存在于概念中而不是名称中吗?为什么将其添加到 C++03 标准中?

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

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

— 如果 T 是非 POD 类类型(子句 9(,则默认构造函数为 调用 T(如果 T 没有,则初始化格式不正确 可访问的默认构造函数(;

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

— 否则,对象初始化为零。

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

— 如果 T 是类类型 (条款 9( 使用用户声明的构造函数 (12.1(,则默认 调用 T 的构造函数(如果 T 初始化格式不正确( 没有可访问的默认构造函数(;

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

— 如果 T 是 数组类型,然后对每个元素进行值初始化;

— 否则, 对象初始化为零

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

引用ISO/IEC 14882:1998标准文件(已从ISO撤回(:

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

  • 如果 T 是非 POD 类类型(子句 9(,则调用 T 的默认构造函数(如果 T 没有 可访问的默认构造函数(;
  • 如果 T 是数组类型,则每个元素都是默认初始化的;
  • 否则,对象的存储初始化为零。

在第7段中:

初始值设定项是一组空括号(即 ()(的对象应默认初始化。

有关更改背后的基本原理的详细信息,请参阅实现更改的缺陷报告:

此定义适用于局部变量,但不适用于 由于执行 的表达式而初始化的对象 形式T(),因为由此类表达式生成的对象将 立即复制,因此应具有 确保可复制。
为此,我建议增加 在8.5第5段的新案文之后:

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

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

此外,我建议将"默认初始化"更改为 5.2.3 第 2 段中的"值初始化"。

之后,历史解释:

古代史

曾几何时,一位名叫劳拉·伊夫斯(Laura Eaves(的AT&T编译器开发人员问道。 我:"int()的价值应该是多少?我的第一个想法是 它应该与x说完后的值相同

int x;

但我很快意识到这个定义是行不通的。原因是 x 具有不确定的值(假设它是局部值( 变量(,但我们不介意x是不确定的,因为我们是 大概是在我们使用之前为x分配一个值。相比之下, int()最好不要有一个不确定的值,因为复制 这样的值具有未定义的影响。禁止 编译器在编译期间标记int(),只是为了允许它 在执行过程中标记它![...]