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

Non-const pointer prefers const T& overload to const T*

假设我有两个函数重载

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

对于使用模板推导的重载解析,第一步是解析模板。然后对结果应用 non-template 排序。在您的代码中,模板分辨率为:

void f(int * const &)   // 1

void f(int const *)     // 2

根据 C++14 [over.ics.ref],在 (1) 中直接绑定到参数的引用是 身份转换 (即使有添加 cv-qualifiers)。 TT const & 的绑定是直接绑定,即没有创建和绑定临时对象。

然而,(2)涉及资格转换。参数类型 int * 必须转换为 const int * 才能匹配函数参数。

身份转换被认为是任何 non-identity 转换序列的 sub-sequence,因此 (1) 根据 sub-sequence 规则 [over.ics.rank]/3.1 获胜。 1