为什么我的构造函数初始化程序不能使用复制初始化?
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)
and a = b
都是表达式(后缀表达式和赋值表达式),我的 C++ 书 [1] 说“初始化器可以是任何任意复杂的表达式”。
[1] 李普曼,拉乔伊,莫。 “C++ 入门,第四版。” p457。
这不是直接初始化。T a = b;
叫做复制初始化。直接初始化是T a(1, 'foo', false);
,在你的构造函数中你会写熟悉的T(int b) : a(b, 'foo', false) { }
达到这种效果,就像你已经在你的first例子。
相比之下,T a;
叫做默认初始化,您可以通过在初始值设定项列表中保留完全未提及的变量来实现。它的作用是调用类类型的默认构造函数,并且对基本类型根本不执行初始化(数组也是如此)。
再次对比一下,值初始化可以写成T(int b) : a() { }
。您还可以使用值初始化new
表达式,但由于令人烦恼的解析,它们在自动声明中很棘手。
我认为直接初始化、默认初始化和值初始化是 C++98/03 中初始化器列表中唯一允许的初始化形式,而 C++11 添加了各种统一初始化的形式。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)