5

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

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 编译器标志编译它。

4

1 回答 1

7

由于 C++20 聚合具有隐式生成的推导指南,因此类模板参数推导也适用于聚合。

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

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

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还不支持聚合的类模板参数推导

于 2022-01-19T07:27:10.723 回答