c++ - 如何编写联合类型的扣除指南
问题描述
假设我们有这个模板用于一个结构和一个相同大小的字节数组的联合
template<typename T>
union point {
struct { T x, y; } coord;
static constexpr size_t buffer_size = sizeof(coord);
unsigned char buffer[buffer_size];
};
我们想在 C++17 之后的客户端代码中使用 CTAD 和聚合初始化
auto p1 = point { .coord = { 0.1, 0.2 } };
auto p2 = point { .coord = { 1, 2 } };
编译器希望我们有一个类型的推导指南point
。在联合类型的情况下如何定义?
解决方案
推导指南基于构造函数,可以是由显式推导指南创建的假设构造函数,也可以是实际存在的构造函数。指定初始化器是聚合初始化的一种形式,一个类型只有在没有构造器的情况下才能成为聚合。
虽然这可能仍然允许显式推导指南,但只有在列表初始化语法可以选择构造函数时才有效。但是包含指定初始值设定项的花括号初始化列表不能选择构造函数。
简而言之,您不能将指定的初始化程序和 CTAD 结合起来。完全没有。
请注意,您通常可以将 CTAD 与联合一起使用,但这需要编写构造函数并可能使用标记调度来指定每个构造函数初始化的成员。问题来自尝试将联合初始化为聚合。
推荐阅读
- android - 是什么导致错误 java.lang.IllegalArgumentException: Requested zoomRatio 1.0 is not within valid range [1.0 , 0.0] in CameraX Api in Android?
- solr - solr:在 enumField 上使用 json api 进行分面会引发错误“预期的数字字段类型”
- javascript - 添加表格列数html
- python - Python html网页抓取标题和标题
- vue.js - 如何以页面作为过渡在 vue.js 中的页面之间进行过渡?
- regex - 匹配 gcc -L 编译器参数 - 表达式,仅当它们被撇号包围时才带有空格
- java - Android - Jsoup 连接在模拟器上成功,但在设备上失败
- shell - 将变量值从一个文件写入另一个文件
- openstack - Amphora 没有获得 IP
- flutter - 每次运行 Flutter Web 下载大约 5 MB(演示应用程序)