非常量指针更喜欢使用const T&重载而不是const T *。

9
假设我有一个函数的两个重载版本
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

4
f(new int)解析为f(const T&),其中T设置为int*,而不是int。就像您调用签名为f(int* const&)的函数一样。 - R Sahu
我知道这部分。我的问题是,为什么f(int* const&)f(const int*)更匹配? - Kan Li
1个回答

13

对于模板推导的重载分辨,第一步是解析模板。然后将非模板排序应用于结果。在您的代码中,模板解析如下:

void f(int * const &)   // 1

void f(int const *)     // 2

根据C++14 [over.ics.ref],直接绑定参数的引用绑定(如(1))是一种标识转换(即使有添加的cv限定符)。将T绑定到T const &是一个直接绑定,即不会创建临时变量并绑定。
然而,(2)涉及到一个资格转换。参数类型int*必须在匹配函数参数之前转换为const int*
标识转换被认为是任何非标识转换序列的子序列,因此根据子序列规则[over.ics.rank]/3.1.1,(1)获胜。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接