在构造函数初始化器中复制初始化?

时间:2011-11-03 21:26:32

标签: c++ constructor initialization

为什么我的构造函数初始值设定项不能使用复制初始化?

struct S { int a; S(int b) : a(b)  {} }; // direct initialization compiles
struct T { int a; T(int b) : a = b {} }; // copy initialization does not

我很困惑,因为a(b)a = b都是表达式(后缀和分配表达式,分别是),而我的C ++书[1]说“初始化程序可能是任意复杂的表达式。 “

[1] Lippman,Lajoie,Moo。 “C ++ Primer,4th ed。” P457。

1 个答案:

答案 0 :(得分:3)

这不是直接初始化。 T a = b;称为复制初始化。直接初始化为T a(1, 'foo', false);,在构造函数中,您可以编写熟悉的T(int b) : a(b, 'foo', false) { }来实现此效果,就像您在第一个示例中已有的那样。

相比之下,T a;被称为默认初始化,您可以通过在初始化列表中保留完全未提及的变量来实现。它的作用是调用类类型的默认构造函数,并根本不对基本类型执行初始化(同上数组)。

相反,值初始化可以写为T(int b) : a() { }。你也可以在new表达式中使用值初始化,但由于烦恼的解析,它们在自动声明中很诡异。

我认为直接,默认和值初始化是C ++ 98/03中初始化列表中唯一允许的初始化形式,而C ++ 11则为混合添加了各种各样的统一初始化。