我正在阅读Bjarne的Rvalue Reference Quick Look,并参加了以下示例:
template <class T, class A1>
std::shared_ptr<T>
factory(A1& a1)
{
return std::shared_ptr<T>(new T(a1));
}
这要好得多。如果将const限定类型传递给 在工厂中,const将被推导出模板参数(A1为 示例)然后正确转发到T的构造函数。
我不明白::factory()
如何接受const引用。 Bjarne只是声明const将被推导到模板参数中。这到底是什么意思?
答案 0 :(得分:5)
如果您传入const X
类型的左值,那么A1
将被推断为const X
,您将获得一个类似于
std::shared_ptr<T> factory(const X& a1) { ... }
答案 1 :(得分:2)
模板类型推导通常在三种情况下发生:
您的案例属于非通用参考参数扣除。规则将是: 如果表达式是引用,请忽略它 模式匹配表达式对参数类型的类型,以确定类型T
例如:
template<typename T>
void factory(T& param); // param is a reference
int x = 42; // int
const int cx = x; // copy of int
const int& rx = x; // ref to const view of int
factory(x); // 1, T = int, param's type = int&
factory(cx); // 2, T = const int, param's type = const int&
factory(rx); // 3, T = const int, param's type = const int&
现在,您可以看到传入const X
的时间与案例2相符,如果您传入const X&
则与案例3相符。
注意:std :: shared_ptr是你的样本中的噪音,我删除它以证明类型扣除。