在构造函数初始值设定项中复制初始化?

2023-12-01

为什么我的构造函数初始化程序不能使用复制初始化?

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(使用前将#替换为@)

在构造函数初始值设定项中复制初始化? 的相关文章

随机推荐