非常量指针更喜欢 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*)
?标准中的任何地方都谈到了这种违反直觉的行为?
对于使用模板推导的重载解析,第一步是解析模板。然后对结果应用 non-template 排序。在您的代码中,模板分辨率为:
void f(int * const &) // 1
void f(int const *) // 2
根据 C++14 [over.ics.ref],在 (1) 中直接绑定到参数的引用是 身份转换 (即使有添加 cv-qualifiers)。 T
到 T const &
的绑定是直接绑定,即没有创建和绑定临时对象。
然而,(2)涉及资格转换。参数类型 int *
必须转换为 const int *
才能匹配函数参数。
身份转换被认为是任何 non-identity 转换序列的 sub-sequence,因此 (1) 根据 sub-sequence 规则 [over.ics.rank]/3.1 获胜。 1
假设我有两个函数重载
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*)
?标准中的任何地方都谈到了这种违反直觉的行为?
对于使用模板推导的重载解析,第一步是解析模板。然后对结果应用 non-template 排序。在您的代码中,模板分辨率为:
void f(int * const &) // 1
void f(int const *) // 2
根据 C++14 [over.ics.ref],在 (1) 中直接绑定到参数的引用是 身份转换 (即使有添加 cv-qualifiers)。 T
到 T const &
的绑定是直接绑定,即没有创建和绑定临时对象。
然而,(2)涉及资格转换。参数类型 int *
必须转换为 const int *
才能匹配函数参数。
身份转换被认为是任何 non-identity 转换序列的 sub-sequence,因此 (1) 根据 sub-sequence 规则 [over.ics.rank]/3.1 获胜。 1