Kan*_* Li 9 c++ overloading c++11
假设我有一个函数的两个重载
template <typename T>
void f(const T&) {
cout << "f(T&)" << endl;
}
template <typename T>
void f(const T*) {
cout << "f(T*)" << endl;
}
Run Code Online (Sandbox Code Playgroud)
为什么要f(new int)解决f(const T&)而不是f(const T*)?标准中的任何地方都谈到了这种反直觉的行为?
M.M*_*M.M 13
对于使用模板推导的重载解析,第一步是解析模板.然后将非模板排序应用于结果.在您的代码中,模板分辨率为:
void f(int * const &) // 1
void f(int const *) // 2
Run Code Online (Sandbox Code Playgroud)
根据C++ 14 [over.ics.ref],直接绑定到参数(如(1)中)的引用是身份转换(即使有添加的cv限定符).Tto 的绑定T const &是直接绑定,即不创建和绑定临时绑定.
但是,(2)涉及资格转换.参数类型int *必须const int *在与函数参数匹配之前转换为.
身份转换被认为是任何非身份转换序列的子序列,因此(1)根据子序列规则获胜[over.ics.rank] /3.1.1