重载模板和参数匹配 - C ++ Primer中可能的拼写错误?

时间:2017-05-01 23:38:51

标签: c++ templates

只是想确认这是否是拼写错误,或者我不明白函数模板参数匹配是如何工作的。鉴于这两个函数定义:

// print any type we don't otherwise handle
template <typename T> string debug_rep(const T &t)
{
  ostringstream ret; // see 8.3
  ret << t; // uses T's output operator to print a representation of t
  return ret.str(); // return a copy of the string to which ret is bound
}

// print pointers as their pointer value, 
// followed by the object to which the pointer points
// NB: this function will not work properly with char*; see 16.3
template <typename T> string debug_rep(T *p)
{
  ostringstream ret;
  ret << "pointer: " << p;       // print the pointer's own value
  if (p)
    ret << " " << debug_rep(*p); // print the value to which p points
  else
    ret << " null pointer";      // or indicate that the p is null
  return ret.str(); // return a copy of the string to which ret is bound
}

考虑以下电话:

const string *sp = &s;
cout << debug_rep(sp) << endl;

这两个模板都是可行的,两者都提供完全匹配:

  • debug_rep(const string* &),第一个实例化 T绑定到const string*的模板版本 这是一个错误吗?由于T已在函数参数
  • ,因此不应string*绑定到const
  • debug_rep(const string*),第二个实例化 T绑定到const string的模板版本。

我的第一个问题是粗体,在上面。跟进问题:如果这不是拼写错误,并且T绑定到const string*,那么这意味着我们不会debug_rep(const const string* &)(对于第一个函数),而不是debug_rep(const string* &) (我只是将T替换为const string*)。如果它不暗示debug_rep(const const string* &),那么函数参数中的const去了哪里?我没有得到什么?...

提前谢谢。

0 个答案:

没有答案