C++20中的指定初始化器(designated initializers)

      指定初始化器(designated initializers, 指定初始值设定项)语法如下:C风格指定初始化器语法,初始化数据成员的一种便捷方式

T object = { .des1 = arg1, .des2 { arg2 } ... };
T object { .des1 = arg1, .des2 { arg2 } ... };

      说明:

      1.每个指示符(designator)必须命名T的直接非静态数据成员,并且表达式中使用的所有指示符必须以与T的数据成员相同的顺序出现。

      2.使用点运算符(.)后跟成员名称来指定要初始化的成员。

      3.禁止收缩转换(narrowing conversion)。

      4.每个联合(union)只能提供一个初始化器。

      5.指定初始化器列表中未明确列出的任何成员字段均会进行默认初始化

      6.也可用于初始化嵌套的结构或数组(nested structs or arrays),但指示符不能嵌套。

      7.不能混合designated and non-designated initialization。

      以下为测试代码:

namespace {

struct A { int x; int y; int z; };
union u { int a; const char* b; };

struct B {
	std::string str;
	int n = 42;
	int m = -1;
};

struct D {
	A a;
	int m;
	int n;
};

} // namespace

int test_designated_initializers()
{
	A a{ .x = 1, .z = 2 }; // a.y initialized to 0
	std::cout << "value: " << a.x << "," << a.y << "," << a.z << std::endl;

	A b = { .y{1}, .z{2} }; // b.x initialized to 0
	std::cout << "value: " << b.x << "," << b.y << "," << b.z << std::endl;

	//A c{ .y = 2, .x = 1 }; // error; designator order does not match declaration order

	u f = { .b = "blog" }; // active member of the union is b
	std::cout << "value: " << f.b << std::endl;

	B x{ .m = 8 };
	std::cout << "value: " << x.str << "," << x.n << "," << x.m << std::endl;

	//B y{ .str{"c++20"}, .n{6}, 8 }; // error C7556: 不能将指定初始值设定项与非指定初始值设定项混合

	//D t{ .a.x{1} }; // error C7558: 标准C++指定初始值设定项中不允许嵌套的成员访问; 请使用嵌套的初始值设定项列表
	D w{ .a{a}, .m{6}, .n{8} };
	std::cout << "value: " << w.a.x << "," << w.a.y << "," << w.a.z << "," << w.m << "," << w.n << std::endl;

	return 0;
}

      执行结果如下图所示:

      GitHubhttps://github.com/fengbingchun/Messy_Test

相关推荐

  1. c++ 指针初始化

    2024-07-09 22:02:06       50 阅读
  2. C#对象初始化

    2024-07-09 22:02:06       53 阅读
  3. (C++20) constinit常量初始化

    2024-07-09 22:02:06       54 阅读
  4. C语言数组初始化

    2024-07-09 22:02:06       59 阅读
  5. 探究C++20协程(4)——协程调度

    2024-07-09 22:02:06       21 阅读
  6. C++20jthread

    2024-07-09 22:02:06       31 阅读
  7. C语言如何初始化指针

    2024-07-09 22:02:06       29 阅读
  8. c++20jthread再谈

    2024-07-09 22:02:06       32 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-09 22:02:06       49 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-09 22:02:06       53 阅读
  3. 在Django里面运行非项目文件

    2024-07-09 22:02:06       42 阅读
  4. Python语言-面向对象

    2024-07-09 22:02:06       53 阅读

热门阅读

  1. 小型简易GIT服务器搭建和使用

    2024-07-09 22:02:06       20 阅读
  2. 开源许可(Open Source License)

    2024-07-09 22:02:06       19 阅读
  3. 使用 HAProxy 进行 MySQL 负载均衡

    2024-07-09 22:02:06       23 阅读
  4. 【Tools】了解人工通用智能 (AGI):未来的智能体

    2024-07-09 22:02:06       21 阅读
  5. HTML最快速最简单

    2024-07-09 22:02:06       21 阅读
  6. 等保测评推动黑龙江数字化转型中的安全保障

    2024-07-09 22:02:06       19 阅读
  7. 嵌入式硬件电路常用设计软件

    2024-07-09 22:02:06       24 阅读
  8. [终端安全]-2 移动终端之硬件安全(SE)

    2024-07-09 22:02:06       18 阅读
  9. Kafka 典型问题与排查以及相关优化

    2024-07-09 22:02:06       19 阅读