指针与指针的部分排序

Partial ordering of pointer vs. pointer to const

本文关键字:指针 排序      更新时间:2023-10-16

多亏了功能模板的部分排序,以下内容似乎是明确的:

template <class T> void f(T*) {
   cout << "T*" << endl;
}
template <class T> void f(const T*) {
   cout << "const T*" << endl;
}
int main(){
    int *p = nullptr;
    f(p);
}

T在两种情况下均被推导为int,并且两个专业都可行,第二个重新定义从int *转换为const int*。两者都添加到过载集中。

要找到最佳的可行函数,我们转向部分排序。我们为每种综合新类型并获取void f(X*)void f(const Y*)。然后,我们确实在两者之间键入扣除。[temp.deduct.partial]¶8:

使用结果类型P和A,然后按照17.8.2.5中的描述进行扣除。(...)如果给定类型的推力成功,则参数模板的类型被认为至少与参数模板的类型一样专业。

给定const Y*template <class T> void f(T*)推论是否成功?是的,使用T=const Y

给定X*的CC_11推力是否成功?是的,使用T=X(需要隐式资格转换)。

so x和y至少与另一个一样专业,这意味着两个专业都至少与另一个专业,这意味着呼叫模棱两可。

除了不是,所以我在哪里出错?

我已经弄清楚了我出错的地方:

要找到最佳的可行函数,我们转向部分排序。

不,我们不。为了找到最佳的可行函数,我们按顺序浏览[Over.Match.Best]中的步骤。部分订购只是该列表中的一个点,实际上我们从未达到过,因为最好的可行函数是由列表上的上一个步骤找到的(对于某些参数J,ICSJ(F1)比转换序列更好ICSJ(F2))。

这两个专业确实是同等专业的,但是这没关系,因为我们首先从未使用部分订购。

template <class T> void f(const T*)确实比template <class T> void f(T*)更专业,但以后是一个确切的匹配。

如果您查看Overload_resolution#BEST_VIABLE_FUNCTICT:

最佳可行功能:

1)至少有一个f1的参数,其隐式转换比F2的论点的相应隐式转换更好 [..]
5)或者,如果不是这样,F1和F2既是模板专业化