【问题标题】:T v{} initializationT v{} 初始化
【发布时间】:2014-09-21 21:45:59
【问题描述】:

我正在阅读 C++11 标准,但不知道是否

T x{};

是值初始化或默认初始化(自动存储)。 它确实很清楚地说:

10 初始化器为空括号集的对象,即 (),应进行值初始化。

还有那个

11 如果没有为对象指定初始化器,则该对象是默认初始化的;

但我能找到的关于T x{}; 的只有:

以 T x(a) 形式发生的初始化; Tx{a}; 以及在 new 表达式 (5.3.4)、static_cast 表达式 (5.2.9)、函数符号类型转换 (5.2.3) 以及基类和成员初始化程序 (12.6.2) 中称为直接初始化。

如果初始值设定项是(无括号的)大括号初始化列表,则对象或引用是列表初始化的 (8.5.4)。

我不熟悉阅读标准的水平。有人能指出我正确的方向吗?

【问题讨论】:

    标签: c++ c++11 language-lawyer uniform-initialization


    【解决方案1】:

    这确实包含在您的报价中:

    如果初始化器是(非括号)braced-init-list,则对象或引用是列表初始化的 (8.5.4)。

    跳到 8.5.4 列表初始化。这里我解释/省略了一些与T x{} 的情况无关的点:

    类型 T 的对象或引用的列表初始化定义如下:

    • 如果 T 是聚合,则执行聚合初始化 (8.5.1)。
    • 否则,如果初始化列表没有元素,并且 T 是具有默认构造函数的类类型,则对象是值初始化的
    • 否则,如果 Tstd::initializer_list<E> 的特化 [...]
    • 否则,[如果列表不为空且与构造函数匹配]
    • 否则,[如果列表只有一个元素]
    • 否则,[如果T 是引用类型]
    • 否则,如果初始化列表中没有元素,则对象被值初始化。
    • 否则,程序格式错误。

    第一点,聚合初始化也是C++03;在这种情况下,T x{};T x = {}; 相同。

    对于第二点“T是具有默认构造函数的类类型”,是值初始化,即调用默认构造函数。

    如果T 是原始类型,则应用倒数第二个点并再次值初始化

    回到聚合初始化案例,在 8.5.1/7 中有:

    如果列表中的初始化子句少于聚合中的成员,则每个未显式初始化的成员都应从其大括号或相等初始化器中初始化,或者,如果没有大括号或相等-initializer,来自一个空的初始化列表 (8.5.4)。

    brace-or-equal-initializer 是指在类定义中内联提供的初始化器。如果不存在,则将其初始化,就好像该成员已使用 {} 初始化一样(因此,此逻辑递归地应用于每个聚合成员)。

    例如,

    struct T
    {
         int a;
    };
    

    然后 T x {}; 导致 aint a{}; 一样被初始化,这是值初始化,因为 int 是原始类型。

    【讨论】:

    • 感谢您找到这个 - 我阅读了 list-initialization 并认为它暗示使用 > 1 个元素。
    • 看到这里,我对C++又敬畏又害怕。
    • @Vilx 嘿嘿。有很多东西要知道。非聚合的列表初始化是在 C++11 中添加的......它解决了一些问题(搜索“最令人烦恼的解析”),但添加了一些新的奇怪的极端情况
    【解决方案2】:

    虽然 Matt McNabb 已经介绍了这一点,但我要补充一点,如果您在浏览标准时遇到问题,请查看 cppreference。他们在list initialization 上的部分很好地分解了它。

    基本上,就像你的标准报价所说,T x{}; 指的是:

    用大括号括起来的列表初始化命名变量 表达式或嵌套列表 (braced-init-list)。

    还有:

    T 类型对象的列表初始化的效果是:

    • 如果花括号初始化列表为空且 T 是具有默认构造函数的类类型,则执行值初始化。

    [...]

    • 否则,如果花括号初始化列表没有元素,则 T 是值初始化的。

    【讨论】:

      猜你喜欢
      • 2015-08-10
      • 2012-02-10
      • 1970-01-01
      • 1970-01-01
      • 2021-04-05
      • 2013-10-25
      • 2018-11-06
      • 2023-03-23
      • 1970-01-01
      相关资源
      最近更新 更多