首页 > 解决方案 > 如何编写联合类型的扣除指南

问题描述

假设我们有这个模板用于一个结构和一个相同大小的字节数组的联合

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。在联合类型的情况下如何定义?

标签: c++c++20unionsctad

解决方案


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

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

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

请注意,您通常可以将 CTAD 与联合一起使用,但这需要编写构造函数并可能使用标记调度来指定每个构造函数初始化的成员。问题来自尝试将联合初始化为聚合。


推荐阅读