函数模板中的参数推导

Argument deduction inside function template

本文关键字:参数 函数模板      更新时间:2023-10-16

在某个项目中工作时,我遇到了这样的事情:

template <typename T>
class Foo
{
public:
Foo(const T&);
};
template <typename T>
auto bar(const T& t)
{
return Foo(t);
}

在这种情况下,Foo的模板参数是如何推导的?

出于类模板参数推导的目的,您的类Foo将有一个(隐式生成的(虚构函数模板重载:

template<class T> Foo<T> F(const T&);

此外,复制扣除指南给出了虚构的重载:

template<class T> Foo<T> F(Foo<T>);

没有用户定义的演绎指南,因此此集是完整的。执行模板参数推导和重载解析就像您调用此F一样。

假设t不是某些U的 cv/ref 合格Foo<U>,第一个模板将始终被选择,因为第二个模板无法推导出来。

第一次重载基本上会推断T为删除了 ref 和 const 限定符的t类型,这也是从删除了 ref 和 const 限定符的barT

如果t是符合 cv/ref 条件的Foo<U>,对于某些U,则由于在函数模板部分排序中首选第二个重载,T将被推导出为该U

因此,例如

bar(1)                    // Deduces Foo<int>
bar<const int&>(1)        // Deduces Foo<int>
bar<const int>(1)         // Deduces Foo<int>
bar(Foo<int>{1})           // Deduces Foo<int>
bar(Foo<const int&>{1})    // Deduces Foo<const int&>