【问题标题】:Default values in C++ initializer listsC++ 初始值设定项列表中的默认值
【发布时间】:2012-12-24 22:32:58
【问题描述】:

我昨天才知道,为初始化列表项指定参数是可选的。但是,这种情况发生的规则是什么?

在下面的例子中,ptr 是否会被初始化为 0,切换为 false,Bar 默认构造?我想这个问题有点多余,因为如果未指定的参数值 == 未定义的行为,初始化列表中将没有什么意义。

我是否也可以指出 C++ 标准的部分,该部分说明了在初始化列表项没有被赋予参数的情况下的行为?

class Bar
{
    Bar() { }
};

class SomeClass;
class AnotherClass
{
public:
    SomeClass *ptr;
    bool toggle;
    Bar bar;

    AnotherClass() : ptr(), toggle(), bar() { }
    // as opposed to...
    // AnotherClass() : ptr(NULL), toggle(false), bar(Bar()) { }
};

【问题讨论】:

标签: c++ standards initializer-list


【解决方案1】:

是的,成员将分别初始化为零和默认构造的对象。

C++ 11 标准在 12.6.2/7 中指定了这种行为:

使用了 mem-initializer 中的表达式列表或大括号初始化列表 初始化指定的子对象(或者,在 委托构造函数,完整的类对象)根据 8.5 直接初始化的初始化规则。

8.5/10 依次为:

一个对象,其初始值设定项是一组空括号,即 (), 应该是值初始化的。

第 8.5/7 段定义值初始化

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

  • 如果 T 是具有用户提供的构造函数的(可能是 cv 限定的)类类型(第 9 条) (12.1),然后调用 T 的默认构造函数(并且 如果 T 没有可访问的默认值,则初始化格式错误 构造函数);
  • 如果 T 是(可能是 cv 限定的)非联合类类型 如果没有用户提供的构造函数,那么对象是 零初始化,如果 T 是隐式声明的默认构造函数 是不平凡的,该构造函数被调用。
  • 如果 T 是数组类型, 然后每个元素都进行值初始化;
  • 否则,对象为 零初始化。

最后,8.5/5 定义了零初始化

对 T 类型的对象或引用进行零初始化意味着:

  • 如果 T 是 标量类型(3.9),对象设置为值0(零),取为 一个整数常量表达式,转换为 T;
  • 如果 T 是 (可能是 cv 限定的)非联合类类型,每个非静态数据 成员和每个基类子对象都是零初始化和填充的 初始化为零位;
  • 如果 T 是(可能是 cv 限定的)联合 类型,对象的第一个非静态命名数据成员为零 初始化和填充被初始化为零位;
  • 如果 T 是 数组类型,每个元素都是零初始化的;
  • 如果 T 是参考 类型,不执行初始化。

【讨论】:

    【解决方案2】:

    在下面的例子中,ptr会被初始化为0,切换为false,Bar默认构造吗?

    是的。如果一个成员初始化器出现在带有空括号的初始化器列表中,则该成员被值初始化。这意味着数值类型将被初始化为零,指向 null 的指针,以及具有使用该构造函数的默认构造函数的类。

    如果您根本不将成员包含在初始化列表中,那么它将改为默认初始化;在这种情况下。数字和指针类型将保持未初始化状态。

    我是否也可以指出 C++ 标准的部分,该部分说明了在初始化列表项没有被赋予参数的情况下的行为?

    C++11 12.6.2/7 指定规则与直接初始化相同。

    C++11 8.5/16 规定如果初始化器是(),则对象是值初始化的。

    C++11 8.5/7 定义了值初始化。

    【讨论】:

      【解决方案3】:

      [dcl.init](又名 8.5)中介绍了初始化

      第 10 点说:

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

      值初始化简单地说,就是类的默认构造和非类类型的零初始化。

      【讨论】:

        猜你喜欢
        • 2016-01-22
        • 2020-09-21
        • 1970-01-01
        • 2019-10-30
        • 1970-01-01
        • 2020-11-16
        • 2013-06-12
        • 2011-10-02
        • 1970-01-01
        相关资源
        最近更新 更多