重载的模板分辨率

时间:2013-07-23 13:47:37

标签: c++ templates generic-programming

以下代码打印“First”。为什么选择第一个模板,而第二个模板似乎更专业,应该是更好的匹配? (我使用MSVC10)

我知道它与某个事实相关,即第二个模板接受const &的论证,但仍然无法理解为什么这会使它更糟糕。

#include <map>
#include <iostream>

template<class Range>
void go(Range &r)
{
  std::cout << "First" << std::endl;
}

template<class K, class V>
void go(const std::map<K, V> &m)
{
  std::cout << "Second" << std::endl;
}


int main()
{
  std::map<int, int> m;
  go(m);
}

1 个答案:

答案 0 :(得分:13)

编译器将第一个模板实例化为

void go(std::map<int, int>& r)

和第二个

void go(const std::map<int, int>& m)

第一个转换序列是身份转换:不需要做任何事情,lvalue参数直接绑定到引用。

第二个转换序列是限定符转换:lvalue参数需要添加const以绑定到引用。

所以第一个是更好的匹配。如果main中的变量开始是const,那么第二个将是更好的匹配,因为你可以看到here,因为这两个模板实例化到同一个东西,然后只做了概念&#34;更专业化的#34;发挥作用。