[英]Comparison of member initialization by constructor vs. direct initialization
我正在创建一个类,其中一个成员是指向该结构的另一个成员的const指针(不可变地址)。
在下面的简化版本中,两个类的行为总是一样吗? 尤其是在保证是否正确初始化ptr
中存储的地址的意义上。
struct First
{
int a;
int* const ptr = &a;
};
struct Second
{
int a;
int* const ptr;
Second() : ptr(&a) {}
};
(在我的实际应用程序中,成员a
是一个类实例,而ptr
被从一些枚举到指向a
成员的指针的映射所取代。)
在下面的简化版本中,两个结构的行为总是一样吗?
不,他们不会,但是您的情况可能没问题。 继续阅读。
First::ptr
和Second::ptr
都将初始化为期望值,分别是First::a
和Second::a
,但是:
[class.mem]/7
和[class.mem]/9
7 在一个成员声明符 ,一个=紧跟在说明符被解释为引入如果声明符-ID具有功能类型的纯说明符 ,否则它被解释为引入支架-或等于初始值设定 。
9 大括号或等于初始化器仅应出现在数据成员的声明中。 (对于静态数据成员,请参阅12.2.3.2;对于非静态数据成员,请参阅15.6.2和11.6.1)。 用于非静态数据成员的大括号或相等初始化器为该成员指定一个默认成员初始化器 , 并且不得直接或间接引起该封闭类的默认默认构造函数的隐式定义或该构造函数的异常规范。
这意味着, First
具有默认的默认构造函数,而Second
具有用户提供的默认构造函数,该默认构造函数更改了这些类的某些特征。 例如,我可以想到聚合 , 琐碎甚至标准布局 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.