12

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

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

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

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

— 如果 T 是非 POD 类类型(第 9 条),则调用 T 的默认构造函数(如果 T 没有可访问的默认构造函数,则初始化是非良构的);

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

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

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

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

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

— 如果 T 是一个数组类型,那么每个元素都是值初始化的;

— 否则,对象被零初始化

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

4

1 回答 1

10

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

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

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

在第 7 段中:

初始化器是一组空括号的对象,即 ,()应被默认初始化。

有关更改背后的基本原理的详细信息,请参阅导致更改发生的缺陷报告

此定义适用于局部变量,但不适用于由于执行 form 表达式而初始化T()的对象,因为由此类表达式产生的对象将立即被复制,因此应具有确保可复制的值。
为此,我建议在 8.5 第 5 段中添加以下新文本:

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

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

另外,我建议在 5.2.3 第 2 段中将 ''default-initialization'' 更改为 ''value-initialization''。

然后,一个历史解释:

古代历史

曾几何时,一位名叫 Laura Eaves 的 AT&T 编译器开发人员问我:“应该是什么值?int()x

int x;

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

于 2014-12-08T00:50:35.273 回答