模板空括号初始化扣除

Template empty bracket initialization deduction

本文关键字:初始化      更新时间:2023-10-16

我认为模板函数可以有默认参数参数(不是模板参数,而是运行时参数)。我们还可以使用空括号初始化来初始化一个类。但是编译器如何匹配模板?

为什么编译这段代码,编译器如何进行推导,以及这个函数调用示例中的参数是什么?

我所了解的: 默认括号初始化调用空构造函数,该构造函数是隐式创建的,因为没有用户定义的构造函数或用户定义的默认构造函数。也就是说,我们可以用 {} 初始化任何包。所以扣除额在那里不适用,因为我们不能选择一个包,每个包都是候选的。也许默认的可变参数模板参数是<>(没有参数)。

template<typename...> class pack {};
template<class... Args>
inline auto make(pack<Args...> = {}) {
}
int main() { make(); }

(与海湾合作委员会编译) 注意:我认为不是,但默认参数可能很有用:调用函数的 2 种方法:make <int、char、int>()(正常使用)或 make(myPack) 来打包可变变量。

给定make();,推导的Args为空; 在这种情况下,make();make<>();具有相同的效果。

模板参数是一个参数包,此处不提供模板参数。请注意,函数默认参数不参与模板参数推导。然后Args被推断为空。

如果参数包显示为最后一个 P,则类型 P 将与调用中剩余每个参数的类型 A 匹配。每个匹配都会推断出包扩展中下一个位置的模板参数:

类型模板参数不能从函数默认参数的类型推导出来: