非常量指针更喜欢const T&过载到const T *

时间:2017-02-16 01:07:02

标签: c++ c++11 overloading

假设我有两个函数重载

template <typename T>
void f(const T&) {
    cout << "f(T&)" << endl;
}

template <typename T>
void f(const T*) {
    cout << "f(T*)" << endl;
}

为什么f(new int)会解析为f(const T&)而不是f(const T*)?标准中的任何地方都在谈论这种反直觉行为?

http://ideone.com/kl8NxL

1 个答案:

答案 0 :(得分:13)

对于带模板扣除的重载解析,第一步是解析模板。然后将非模板排序应用于结果。在您的代码中,模板分辨率为:

void f(int * const &)   // 1

void f(int const *)     // 2

根据C ++ 14 [over.ics.ref],与(1)中的参数直接绑定的引用是身份转换(即使有添加的cv限定符) 。 TT const &的绑定是直接绑定,即不会创建和绑定临时绑定。

但是,(2)涉及资格转换。参数类型int *必须在与函数参数匹配之前转换为const int *

身份转换被认为是任何非身份转换序列的子序列,因此(1)根据子序列规则获胜[over.ics.rank] /3.1.1