C++ - 为什么聚合初始化不适用于模板结构

C++ - Why does aggregate initialization not work with template struct

此代码有效,无需指定构造函数:

struct Foo
{
    int a;
    int b;
};

//...

    int a1, b1;

    Foo foo = {a1, b1};

如果我将 Foo 设为模板,它就不起作用。

template<typename T1, typename T2>
struct Foo
{
    T1 a;
    T2 b;
};

//...

    int a1, b1;

    Foo foo = {a1, b1};

它说演绎失败/提供了 2 个参数,而预期有 1 个。如果我添加一个像 Foo(T1, T2){} 这样的构造函数,那么它就可以工作。我想,这种构造在默认情况下只适用于结构。我哪里错了?

编辑: 我正在使用 Clang,它似乎不支持它。 MSVC 和 GCC 都使用 c++20 编译器标志对其进行编译。

由于 C++20 聚合具有隐式生成的推导指南,因此 class template argument deduction 也适用于聚合。

int a1, b1;
Foo foo = {a1, b1}; // works since C++20; T1 and T2 are deduced as int

在C++20之前,需要添加自定义推导向导,例如

template<typename T1, typename T2>
struct Foo
{
    T1 a;
    T2 b;
};

template<class T1, class T2> Foo(T1 a, T2 b) -> Foo<T1, T2>;

Clang 尚未支持聚合 的 class 模板参数推导。