在Bjarne的这个例子中,为什么你可以将const限定对象传递给非const参数?

时间:2014-07-09 03:40:04

标签: c++ c++11

我正在阅读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将被推导到模板参数中。这到底是什么意思?

2 个答案:

答案 0 :(得分:5)

如果您传入const X类型的左值,那么A1将被推断为const X,您将获得一个类似于

的函数
std::shared_ptr<T> factory(const X& a1) { ... }

答案 1 :(得分:2)

模板类型推导通常在三种情况下发生:

  • 参数类型是引用或指针,但不是通用
  • reference参数类型是通用引用参数类型
  • 既不是引用也不是指针

您的案例属于非通用参考参数扣除。规则将是:   如果表达式是引用,请忽略它   模式匹配表达式对参数类型的类型,以确定类型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是你的样本中的噪音,我删除它以证明类型扣除。