代码之家  ›  专栏  ›  技术社区  ›  Thomson

初始化器列表是否禁止调用构造函数?

c++
  •  3
  • Thomson  · 技术社区  · 14 年前

    如果我用默认构造函数声明一个类,并用下面的初始值设定项列表定义这个类的一个实例,那么会为这个定义调用默认构造函数吗?为什么要被打电话?

    class Sample
    {
    // this should be any aggregate type in c++
    };
    
    int main()
    {
      Sample s = {0};
      return 0;
    }
    
    5 回复  |  直到 14 年前
        1
  •  1
  •   Prasoon Saurav    14 年前

    标准显示(8.5美元/14美元)

    初始化器的语义如下。目标类型是要初始化的对象或引用的类型,而源类型是初始值设定项表达式的类型。当初始值设定项被大括号括起或是表达式的括号列表时,未定义源类型。

    如果目标类型是(可能是cv限定的)类类型: –如果类是一个聚合(8.5.1),并且初始值设定项是一个括号括起来的列表,请参见8.5.1。 .

    .

    8.5.1/13条

    [注意:聚合数组或聚合类可以包含具有用户声明的构造函数(12.1)的类类型的成员。12.6.1中描述了这些聚合对象的初始化。]

    12.6.1/2也表示

    当聚合(无论是类还是数组)包含类类型的成员并由括号括起的初始值设定项列表(8.5.1)初始化时, 每个这样的成员都由相应的赋值表达式进行复制初始化(参见8.5 . 如果初始值设定项列表中的初始值设定项少于聚合的成员, 未明确初始化的每个成员应进行值初始化(8.5)。

        2
  •  5
  •   Community CDub    8 年前
    • 在C++ 03中,只有 aggregate classes 可以用大括号初始化,聚合类不能有用户定义的构造函数
    • 在C++ 0x中,通过非聚集类型支持此语法。 initializer lists 并调用适当的构造函数(获取 std::initializer_list )
        3
  •  3
  •   CB Bailey    14 年前

    当您提供一个括号括起的初始值设定项时,类的所有成员都将从括号括起的初始值设定项的相应表达式进行复制初始化。

    这种初始化只对不能有用户声明的构造函数的聚合有效,因此编译器生成的构造函数的抑制几乎是学术性的。

        4
  •  1
  •   Å imon Tóth    14 年前
        5
  •  1
  •   fmuecke    14 年前

    在C++中,你只能用= { 0 }(至少预C++0X)初始化POD(普通的旧数据)。因此不会调用默认构造函数,因为这不会编译。