C++值初始化与默认成员初始化:能否断言指针指向空字符串?
C++值初始化后指针指向断言问题解答
代码示例
struct MyType { const char *pointer{""}; }; struct MyTypeHolder { MyType my_type; MyType &GetMyType() { return my_type; } }; int main () { MyTypeHolder my_type_holder; auto &my_type = my_type_holder.GetMyType(); my_type = MyType{}; // May one assert that my_type.pointer points to the empty string? }
问题描述
在上述示例中,my_type = MyType{}会对MyType类型的临时对象执行值初始化。由于MyType的非静态成员带有默认成员初始化器,请问能否断言该对象完成值初始化后,pointer指向空字符串?
解答
可以明确断言my_type.pointer指向空字符串,理由如下:
- 值初始化的行为:
MyType{}属于值初始化操作,对于MyType这种聚合类型,值初始化会逐一初始化其非静态成员。这里pointer成员带有默认成员初始化器"",因此临时对象的pointer会被直接初始化为指向字符串字面量""的地址。 - 拷贝赋值的行为:
MyType是聚合类型,编译器会自动生成默认的拷贝赋值运算符,该运算符会直接拷贝临时对象中pointer成员的地址值到my_type的pointer成员中。 - 字符串字面量的生命周期:字符串字面量
""是程序全局存储区的常量,其生命周期贯穿整个程序运行期,因此拷贝后的指针始终有效,且明确指向空字符串。
内容的提问来源于stack exchange,提问作者TruLa
相关产品推荐
相关产品推荐

