C++ 括号中的元素在结构类型a{a,b,c}之后的含义

C++ 括号中的元素在结构类型a{a,b,c}之后的含义,c++,c++17,C++,C++17,当结构类型不引用结构属性或其自身构造函数的参数时,在结构类型之后传递括号内的对象意味着什么 template <class... Ts> // (1) struct Print : Ts... { using Ts::operator()...; }; template <class... Ts> // (1) auto MakePrint(Ts... ts) { return Print<Ts...>{ts...}; } 这相当于: au

当结构类型不引用结构属性或其自身构造函数的参数时,在结构类型之后传递括号内的对象意味着什么

template <class... Ts> // (1)
struct Print : Ts... {
    using Ts::operator()...;
};

template <class... Ts> // (1)
auto MakePrint(Ts... ts) {
    return Print<Ts...>{ts...};
}
这相当于:

auto MakePrint (typeof(lambda) lambda) {
   return Print<typeof(lambda)>{lambda};
}

那么括号内的对象lambda(return
Print{lambda};
)去了哪里?

从C++17开始聚合可以有基类。既然
Print
继承了
Ts..
do

Print<Ts...>{ts...}

其中
b
foo
部分由
f
初始化,那么我们为什么需要模板推导指南呢?此处:
模板结构重载:Ts。。。{使用Ts::运算符()…;};模板重载(Ts…)->重载;std::visit(重载{[](自动参数){std::cout@Alex您需要一个演绎指南,因为
重载
没有可以用来推断类型的构造函数。因为您在调用
访问
时没有指定类型,所以获得它的唯一方法是使用演绎指南。那么演绎指南是如何工作的呢?我的理解是,如果您使用构造函数at具有与演绎指南相同的签名,然后编译器使用相应的类型,但这里我们使用括号时不使用构造函数style@Alex类模板参数推导是一个两阶段的过程。首先,它使用所有的构造函数和推导向导,并从中合成函数verload解析以找到最佳匹配。如果通过,则使用它计算出的类型作为模板参数的类型。之后,它运行重载解析并找到与参数匹配的构造函数。这意味着CTAD可以使用指南来确定类型,然后使用聚合初始化来实际初始化调整对象的大小。这就是
std::array
的工作方式,因为它没有构造函数。
struct Print : typeof(lambda) {
    auto operator() (int i) { return i + 1; }
}
Print<Ts...>{ts...}
struct foo
{
    int f;
};

struct bar : foo {};

int main()
{
    foo f{42};
    bar b{f};
}