繁体   English   中英

非const指针更喜欢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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM