C++17中使用冒号的结构体初始化语法为何有效?
C++17中结构体指定成员初始化语法解析
在团队代码评审时,我遇到了C++17环境下一种特殊的结构体初始化写法,它能正常运行,但找不到相关参考文档。代码示例如下:
struct TestStruct { std::string test_str1; std::string test_str2; std::string test_str3; }; TestStruct t{test_str1 : "col1", test_str3 : "col3"}; std::cout << "str1: " << t.test_str1 << "\nstr2:" << t.test_str2 << "\nstr3:" << t.test_str3;
运行结果:
str1: col1 str2: str3: col3
这种写法看起来类似构造函数成员初始化列表,但又有省略,下面解释它生效的原因:
这是C++17引入的**指定成员初始化(Designated Initializers)**语法,属于聚合初始化的扩展:
- 适用范围:仅针对聚合类型(比如无用户定义构造函数、无虚函数、无基类的结构体/数组等)。
- 核心逻辑:可以直接通过成员名称指定初始化对应字段,未被指定的成员会自动执行值初始化——比如
std::string会被初始化为空字符串,基本数值类型会被初始化为0。 - 语法细节:
test_str1 : "col1"就是指定初始化的标准写法,C17允许指定初始化的成员顺序与结构体定义顺序不一致;不过C20对此做了限制,要求必须按成员声明顺序进行指定初始化。 - 和构造函数初始化列表的区别:前者是直接在聚合类型对象初始化时使用,无需提前定义构造函数;后者是在类的构造函数内部使用,用于自定义对象初始化逻辑。
简言之,这种写法是C++17正式纳入标准的语法,专门用于聚合类型的选择性成员初始化,未指定成员会自动完成值初始化,因此代码能正常运行并得到对应输出。
内容的提问来源于stack exchange,提问作者starskyTW
相关产品推荐
相关产品推荐

