构造函数与直接初始化的成员初始化比较

时间:2018-01-29 09:20:21

标签: c++ constructor initialization language-lawyer

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

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

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

struct Second
{
  int a;
  int* const ptr;

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

(在我的实际应用中,成员a是一个类实例,ptr被一些枚举的地图替换为指向a成员的指针。)

1 个答案:

答案 0 :(得分:2)

  

在下面的简化版中,两个结构体的行为总是一样吗?

不,他们不会赢,但你的情况可能没问题。请继续阅读。

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

  

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

     

7 成员声明符中,紧跟在声明符之后的=被解释为引入 pure-specifier   如果 declarator-id 具有函数类型,则将其解释为引入大括号或等于初始值

     

9 大括号或等于初始化程序只能出现在数据成员的声明中。 (对于静态数据成员,   见12.2.3.2;对于非静态数据成员,请参见15.6.2和11.6.1)。用于非静态的大括号或等于初始化程序   数据成员为成员指定默认成员初始值设定项,并且不应直接或间接导致   封闭类或异常规范的默认默认构造函数的隐式定义   那个构造函数。

这意味着,First有一个默认的默认构造函数,Second有一个用户提供的默认构造函数,它改变了这些类的某些特性。我可以考虑aggregatestriviality以及标准布局