关于C++中return {}初始化规则的理解正确性确认
C++聚合类型列表初始化规则验证
先看示例代码:
struct A { const char* s_ptr; std::string str; }; A Foo() { return {}; } A a = Foo();
你的结论完全正确:a.s_ptr会被初始化为nullptr,a.str是调用默认构造函数生成的空字符串。
再逐一验证你对规则的理解:
return {};属于复制列表初始化(copy list initialization),这个判断没问题。- 因为
A是聚合类型(无用户声明的构造函数、私有/保护非静态成员、基类等,符合C++对聚合类型的定义),列表初始化时会优先匹配[dcl.init.list]p3.4的规则(聚合初始化),而非后续的类构造函数初始化规则,这里的优先级判断正确。 - 聚合初始化阶段,由于
A的成员都没有默认成员初始化器,所以适用[dcl.init.aggr]p5.2:每个未显式初始化的非引用成员,用空初始化列表进行复制初始化,这部分理解正确。 - 对于
A::s_ptr(指针类型),空列表初始化触发[dcl.init.list]p3.11的规则:空列表初始化非类类型对象时执行值初始化,而指针的值初始化结果就是nullptr(C++11起)。 - 对于
A::str(std::string类类型),空列表初始化触发[dcl.init.list]p3.5的规则:空列表初始化带默认构造函数的类类型时执行值初始化,std::string的值初始化会调用其默认构造函数生成空字符串,这部分理解同样正确。
内容的提问来源于stack exchange,提问作者cbhattac
相关产品推荐
相关产品推荐

