模板分辨率过载

Overloaded template resolution

本文关键字:分辨率      更新时间:2023-10-16

下面的代码打印"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);
}

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

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

第二个是

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

第一个的转换序列是身份转换:无需执行任何操作,lvalue参数直接绑定到引用。

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

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