为什么我的构造函数初始值设定项不能使用复制初始化?
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。
答案 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则为混合添加了各种各样的统一初始化。