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

时间:2010-11-26 07:35:37

标签: c++

如果我使用默认构造函数声明一个类并使用如下的初始化列表定义此类的实例,是否会为此定义调用默认构造函数?为什么被召唤或被召唤?

class Sample
{
// this should be any aggregate type in c++
};

int main()
{
  Sample s = {0};
  return 0;
}

5 个答案:

答案 0 :(得分:5)

  • 在C ++ 03中,只有aggregate classes可以用大括号初始化,而聚合类可能没有用户定义的构造函数
  • 在C ++ 0x中,通过initializer lists支持非聚合类型的此语法,并调用相应的构造函数(采用std::initializer_list

答案 1 :(得分:3)

当你提供一个大括号括号初始化程序时,该类的所有成员都是从大括号括起初始化程序的相应表达式中复制初始化的。

此类初始化仅对无法使用用户声明的构造函数的聚合有效,因此对编译器生成的构造函数的抑制几乎是学术性的。

答案 2 :(得分:1)

答案 3 :(得分:1)

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

答案 4 :(得分:1)

标准说($ 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)。