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 模板参数推导。
此代码有效,无需指定构造函数:
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 模板参数推导。