指派初始化器
- 语法:
T 对象 = { .指派符 = 实参1 , .指派符 { 实参2 } ... }; (C++20 起)
T 对象 { .指派符 = 实参1 , .指派符 { 实参2 } ... }; (C++20 起)
- 规则:
- 规则1:表达式中所用的所有
指派符
必须按照与T
的数据成员相同的顺序出现
- 规则2:类成员可以不全部指定
- 规则3:联合体只能有一个指派器
- 示例
struct A{
int a;
bool b;
char* c;
};
union B{
int a;
bool b;
};
int main() {
//遵循规则1:.a 不能在 .c之后
//遵循规则2:类成员b没有指派
A a={.a=1,.c=(char*)"hello"};
//遵循规则3
B b={.a=2};
// 不遵循规则3:union只能指派一个初始化器
B b1={.a=2,.b=false};//error:too many initializers for 'B'
}
1 和c中的指派符初始化比较
- c指派符初始化:
- 在c99中支持
- 支持结构体成员乱序赋值
- c++指派符初始化:
- 在c++20中支持
- 结构体成员的初始化必须和声明时一致,可以只初始化部分
- 示例
#include <stdio.h>
typedef struct _a
{
int i;
char c[10];
}A;
int main(void)
{
// successful,c编译正确,
// error,但在c++ -std=c++2a中失败,因为不允许成员乱序初始化,即不允许i在c之后赋值
A a={.c={'h','e','l','l','o',0},.i=1};
}