函数模板中的参数推导
Argument deduction inside function template
在某个项目中工作时,我遇到了这样的事情:
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 限定符的bar
T
。
如果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&>
相关文章:
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- 具有常量引用参数的函数模板专用化
- 使用可变参数函数作为模板参数
- std::span<const T> 作为函数模板中的参数
- 如何在C++中伪造虚拟可变参数函数模板?
- C++ std::functional 中的可变参数函数模板
- 可变参数函数模板不能很好地使用 std::function 作为参数
- 三个参数函数模板令人困惑的示例
- 父可变参数函数模板专门用于子级
- C++如何将可变参数函数模板的参数包 -> 包装到 lambda 中
- 将函数传递给可变参数函数模板
- 为什么可变参数函数模板中的这个 constexpr 不是常数?
- 将多个初始值设定项列表传递到可变参数函数模板时遇到问题
- 依赖类型不明确的 c++11 可变参数函数模板重载是否不明确
- 操作可变参数函数模板的函数参数
- C++11 中的非类型可变参数函数模板
- 将可变参数函数模板的每个参数传递给返回void的函数
- 包扩展不在最后一个参数中的可变参数函数模板
- 将可变参数函数模板参数存储到联合向量中的最有效方法
- Clang 和 GCC 在解决可变参数函数模板重载时的行为不同