指针与指针的部分排序
Partial ordering of pointer vs. pointer to const
多亏了功能模板的部分排序,以下内容似乎是明确的:
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既是模板专业化
- std::排序在共享指针的向量上
- 为什么指针在对二维数组进行排序时无法正常工作?
- C++为什么我的指针选择排序中存在分段错误?
- 在基数排序中,我得到 munmap_chunk():无效指针和中止(核心转储).为什么?
- 危险指针的内存排序
- 使用指针指向对象C++对向量进行排序
- 指向指针排序向量的指针向量的 C++ 向量
- 对元素的向量或指向元素的指针进行排序
- 智能指针的排序向量:神秘崩溃
- 如何在 c++ 上对指针列表进行排序
- 我对C 中共享指针列表进行排序的功能未完成类型
- 查找排序的容器,其中指向元素的指针在添加/删除时不会更改
- 固定大小的容器,其中元素被排序,并可以为C 中的数据提供原始指针
- 通过其char键对对象指针的C 向量进行排序
- 排序时引用绑定到 'value_type' 类型的 null 指针
- 字符串指针的排序向量
- 对字符串的指针数组进行排序
- 排序阵列会使指针链接错误
- 使用指针数组按字母顺序排序
- c++用数组、结构体和指针排序