跳转至

指派初始化器

  • 语法:
  • 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};
}