【问题标题】:Is value initialization part of the C++98 standard? If not, why was it added in the C++03 standard?值初始化是 C++98 标准的一部分吗?如果不是,为什么在 C++03 标准中添加它?
【发布时间】:2014-12-08 00:38:03
【问题描述】:

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

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

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

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

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

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

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

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

——如果 T 是类类型 (第 9 条)使用用户声明的构造函数(12.1),然后是默认值 调用 T 的构造函数(如果 T 没有可访问的默认构造函数);

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

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

——否则, 对象是零初始化的

我的猜测是 '98 具有默认初始化但没有值初始化,并且两者之间存在一些关键区别。老实说,我在这里无法解析标准语,而且我不明白定义之间的区别。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    在第 7 段中:

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

    有关更改背后的基本原理的详细信息,请参见实现该更改的 the defect report

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

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

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

    另外,我建议把‘default-initialization’改成 5.2.3 第 2 段中的“值初始化”。

    然后是历史解释:

    古代历史

    曾几何时,一位名叫 Laura Eaves 的 AT&T 编译器开发人员问 我:“int() 的值应该是多少?”我的第一个想法是 应该和x说后的值一样

    int x;
    

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

    【讨论】:

    • 你明白了。我建议将 DR 的一些基本原理带入您的答案中,以使其自成一体。当你这样做时让我知道,这样我就可以投票给你。 :)
    • C++98 版本的烦人之处在于,如果你有一个包含std::string 和一些int 变量的类,就没有办法让它零初始化其他整数而不是在构造函数初始化列表中明确列出它们。
    • @MattMcNabb 我没有关注。将它们全部列在初始化列表中,而不是做什么?如果你没有在 C++03 的初始化列表中列出它们,它们是零初始化的吗?
    • @Praxeolitic in C++98 T() 不会对整数进行零初始化(如果 T 还包含字符串),这在许多习语中都有体现,例如T t = T();T t; t = T();。另一个烦人的地方see here
    猜你喜欢
    • 1970-01-01
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 2021-04-26
    • 2011-01-20
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多