我正在创建一个类,其中一个成员是另一个结构成员的const指针(不可变地址)。
在下面的简化版中,两个类是否总是表现出相同的值?特别是在ptr
中存储的地址是否保证正确初始化的意义上。
struct First
{
int a;
int* const ptr = &a;
};
struct Second
{
int a;
int* const ptr;
Second() : ptr(&a) {}
};
(在我的实际应用中,成员a
是一个类实例,ptr
被一些枚举的地图替换为指向a
成员的指针。)
答案 0 :(得分:2)
在下面的简化版中,两个结构体的行为总是一样吗?
不,他们不会赢,但你的情况可能没问题。请继续阅读。
First::ptr
和Second::ptr
都将初始化为期望值,即First::a
和Second::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
有一个用户提供的默认构造函数,它改变了这些类的某些特性。我可以考虑aggregates,triviality以及标准布局。