union类型的推导指南怎么写
How to write a deduction guide for union type
假设我们有这个模板,用于一个结构和一个相同大小的字节数组的联合
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类型怎么定义?
推导指南基于构造函数,可以是显式推导指南创建的假设推导指南,也可以是实际存在的推导指南。指定初始化器是聚合初始化的一种形式,如果一个类型没有构造函数.
,那么它只能是一个聚合
虽然这可能仍然允许显式推导指南,但只有当列表初始化语法可以 select 构造函数时才有效。但是包含指定初始化程序的花括号初始化列表 不能 select 构造函数。
简而言之,您不能将指定的初始化程序和 CTAD 结合使用。完全没有。
请注意,您通常可以将 CTAD 与联合一起使用,但这需要编写构造函数并可能使用标记分派来指定每个构造函数初始化哪个成员。问题来自于尝试将联合初始化为聚合。
假设我们有这个模板,用于一个结构和一个相同大小的字节数组的联合
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类型怎么定义?
推导指南基于构造函数,可以是显式推导指南创建的假设推导指南,也可以是实际存在的推导指南。指定初始化器是聚合初始化的一种形式,如果一个类型没有构造函数.
,那么它只能是一个聚合虽然这可能仍然允许显式推导指南,但只有当列表初始化语法可以 select 构造函数时才有效。但是包含指定初始化程序的花括号初始化列表 不能 select 构造函数。
简而言之,您不能将指定的初始化程序和 CTAD 结合使用。完全没有。
请注意,您通常可以将 CTAD 与联合一起使用,但这需要编写构造函数并可能使用标记分派来指定每个构造函数初始化哪个成员。问题来自于尝试将联合初始化为聚合。