c++ - 如何写union类型的推导指南

标签 c++ c++20 unions ctad

假设我们有一个结构体和相同大小的字节数组的 union 模板

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类型的推导指南。如果是 union 类型,如何定义?

最佳答案

演绎指南基于构造函数,可以是由显式演绎指南创建的假设构造函数,也可以是实际存在的构造函数。指定初始值设定项是聚合初始化的一种形式,只有在没有构造函数的情况下,类型才能是聚合。

虽然这可能仍然允许显式推导指南,但只有当列表初始化语法可以选择构造函数时才有效。但是包含指定初始值设定项的花括号初始化列表无法选择构造函数。

简而言之,您不能将指定的初始值设定项和 CTAD 结合起来。完全没有。

请注意,您通常可以将 CTAD 与 union 一起使用,但这需要编写构造函数,并且可能需要使用标记分派(dispatch)来指定每个构造函数初始化哪个成员。问题来自于尝试将 union 初始化为聚合。

关于c++ - 如何写union类型的推导指南,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66860745/

相关文章:

c++ - 从常量表达式中有符号整数的溢出中删除未定义的行为?

C++11 空列表 union 的初始化 - 是否保证初始化 union 的全长?

c++ - 获取 .tiff map 中的最短路径

c++ - 如何将存储在变量中的路径用引号引起来?

c++ - 在链接列表中设置指针=空指针和指针->下一个=空指针时,为什么会有不同的效果-C++

c++ - 为什么 C++20 范围不只提供管道语法?

c++ - 空默认构造函数与隐式定义的不同机器代码

c++ - 如何将 C++ 中的虚函数/基类转换为 C 编程?

C++11 "In class initialization"功能不适用于 union

c - uint8_t 类型数组的元素是否总是被打包到连续的内存字节中?