【问题标题】:Overload resolution and explicit template arguments重载决议和显式模板参数
【发布时间】:2016-09-04 18:22:01
【问题描述】:

以下代码prints "func 2"

为什么在存在显式(非推导)模板参数的情况下,编译器将第二个模板视为更好的匹配?为什么没有歧义?

我希望引用 C++ 标准。

#include <iostream>

template<class T>
struct identity
{
    typedef T type;
};

template<class T>
void func(T)
{
    std::cout << "func 1\n";
}

template<class T>
void func(typename identity<T>::type)
{
    std::cout << "func 2\n";
}

int main()
{
    func<int>(1);    
}

【问题讨论】:

    标签: c++ template-specialization overload-resolution


    【解决方案1】:

    两个候选者都是可行的并且采用相同的参数,因此重载解决过程会退回到最后一个决胜局:函数模板的部分排序[temp.func.order]

    规则是我们为每个模板类型参数合成一个新类型,并尝试对彼此的重载进行推导。对于1,我们合成了一个类型Unique1,它在2 上的推导失败,因为T 是一个非推导上下文。对于2,我们合成一个类型Unique2,成功推导出T = typename identity&lt;Unique2&gt;::type。由于推论在一个方向而不是另一个方向上成功,这使得21 更专业,因此它是首选。

    请注意,标准中的模板部分排序规则有些不完整。如果您只是添加另一个 T 类型的参数,则首选 flips

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-22
      • 2014-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多