【问题标题】:Comparison of member initialization by constructor vs. direct initialization构造函数与直接初始化的成员初始化比较
【发布时间】:2018-01-29 09:20:21
【问题描述】:

我正在创建一个类,其中一个成员是指向结构的另一个成员的 const 指针(不可变地址)。

在下面的简化版本中,两个类是否总是表现相同的值?特别是在ptr中存储的地址是否保证正确初始化的意义上。

struct First
{
  int a;
  int* const ptr = &a;
};

struct Second
{
  int a;
  int* const ptr;

  Second() : ptr(&a) {}
};

(在我的实际应用程序中,成员a 是一个类实例,ptr 被替换为从一些枚举到指向a 成员的指针的映射。)

【问题讨论】:

  • 它们在类别(关于聚合......)方面存在细微差别。但ptr 的值已正确初始化。

标签: c++ constructor initialization language-lawyer


【解决方案1】:

在下面的简化版本中,两个结构的行为方式总是相同吗?

不,他们不会,但它可能适合您的情况。继续阅读。

First::ptrSecond::ptr 都将被初始化为预期值,即First::aSecond::a 的地址,但是:

[class.mem]/7 & [class.mem]/9

7 成员声明符中,紧跟在声明符之后的=被解释为引入了一个纯说明符时间> 如果 declarator-id 具有函数类型,否则它被解释为引入了 brace-or-equal-initializer

9 brace-or-equal-initializer 只能出现在数据成员的声明中。 (对于静态数据成员, 见 12.2.3.2;对于非静态数据成员,见 15.6.2 和 11.6.1)。用于非静态的 brace-or-equal-initializer 数据成员为该成员指定一个默认成员initializer不得直接或间接导致 封闭类或异常规范的默认默认构造函数的隐式定义 那个构造函数。

这意味着First 有一个默认的默认构造函数,而Second 有一个用户提供的默认构造函数,它改变了这些类的一些特性。例如,我可以想到aggregatestriviality,也许还有标准布局

【讨论】:

  • 如果我要添加一个简单的构造函数First() {},那会使它们相等还是更相似?
  • @MortenFyhnAmundsen 我想是的。
猜你喜欢
  • 2017-04-17
  • 2011-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多