【问题标题】:Copy initialization in constructor initializer?在构造函数初始化器中复制初始化?
【发布时间】:2011-11-03 21:26:31
【问题描述】:

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

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] 利普曼、拉乔伊、穆。 “C++ 入门,第 4 版。” p457。

【问题讨论】:

  • 你的术语不对,a(b)直接初始化...
  • 对不起,我把“直接”和“复制”换位了。固定。

标签: c++ constructor initialization


【解决方案1】:

这不是直接初始化。 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 则添加了各种风格的统一初始化。

【讨论】:

  • T a;default 初始化,不是直接初始化。 T a(b);是直接初始化。
  • "根本不初始化基本类型(数组同上)" 或任何 POD 类型。
  • @ildjarn:我想“为成员递归定义”?
  • 不确定你的意思——如果一个类型包含非 POD 成员,它就不能是 POD 类型。
  • @nknight:这有什么意义?直接初始化已经足以调用复制或移动构造函数;你还需要什么?复制初始化确实是该语言中最可疑的功能,可能仅出于美观原因而存在...
猜你喜欢
  • 2011-05-02
  • 1970-01-01
  • 2012-03-19
  • 1970-01-01
  • 1970-01-01
  • 2018-06-30
  • 2013-11-17
  • 1970-01-01
  • 2018-08-02
相关资源
最近更新 更多