4

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

我知道这与第二个模板接受其参数 by 的事实在某种程度上有关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);
}
4

1 回答 1

13

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

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

第二个

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

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

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

所以第一个是更好的匹配。如果变量 inmain一开始是 const ,那么第二个将是更好的匹配,正如您在此处看到的那样,因为这样两个模板实例化为相同的东西,然后“更专业”的概念才会发挥作用。

于 2013-07-23T13:50:40.427 回答