【问题标题】:Overloaded template resolution重载的模板分辨率
【发布时间】:2013-07-23 13:47:36
【问题描述】:

以下代码打印“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);
}

【问题讨论】:

    标签: c++ templates generic-programming


    【解决方案1】:

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

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

    第二个到

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

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

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

    所以第一个是更好的匹配。如果main 中的变量一开始是 const,那么第二个将是更好的匹配,如您所见here,因为这样两个模板实例化为相同的东西,然后才出现“更专业”的概念发挥作用。

    【讨论】:

    • 那么,实例化在重载决议之前进行吗?让我们从第二个示例中删除 const。根据你的解释,我们在这里会变得模棱两可。但我们没有。
    • @Igor:如果两个模板实例不明确,那么编译器会查看谁更专业。如果两者都不是,则歧义会导致错误。
    • @Xeo 啊哈,我明白了。谢谢!
    猜你喜欢
    • 2015-09-12
    • 1970-01-01
    • 1970-01-01
    • 2019-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多