use*_*706 5 c++ templates overload-resolution argument-deduction
今天我在stl_pair.h中看到以下代码:
#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER
template <class _T1, class _T2>
inline bool operator!=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) {
return !(__x == __y);
}
template <class _T1, class _T2>
inline bool operator>(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) {
return __y < __x;
}
#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */
Run Code Online (Sandbox Code Playgroud)
我不认为模板功能与功能模板的部分特化有任何关联.我错了吗 ?
在 C++ 中调用函数模板要经历名称查找(标准中的第 3.4 节)、模板参数推导(第 14.8.2 节)和重载解析(第 13.3 节)的神圣三位一体。
\n\n除了阅读C++ 标准中的这些部分之外,您还可以在优秀的《C++ 模板:完整指南》一书中阅读相关内容,或者观看 Stephan T. Lavavej 制作的前三个核心 C++ 视频
\n\n\n\n正如您自己已经发现的那样,该宏最初是在 STL 的 SGI 实现中,当时还没有 C++ 标准,并且编译器对函数模板的支持非常粗略。
\n\n\n\n\n// * __STL_FUNCTION_TMPL_PARTIAL_ORDER:如果编译器支持 // 函数模板的部分排序,则定义。(又名函数模板的部分\n 特化。)
\n
要了解函数模板的部分排序的用途,请参阅此处的引用(如果您阅读本书并观看链接的视频,这将变得更加清晰)。
\n\n14.5.6.2 函数模板的部分排序 [temp.func.order]
\n\n\n\n1如果函数模板被重载,则函数模板特化的使用可能会不明确,因为模板参数推导 (14.8.2) 可能会将函数模板特化与多个函数模板声明相关联。重载函数模板声明的部分排序在以下上下文中用于\n 选择函数模板\n 特化所引用的函数模板:
\n\n\xe2\x80\x94 在重载决策期间调用\n 函数模板特化 (13.3.3);
\n\n\xe2\x80\x94 当获取函数模板特化的地址时;
\n\n\xe2\x80\x94 当选择作为函数模板特化的放置运算符 delete 来匹配放置运算符 new 时(3.7.4.2、5.3.4);
\n\n\xe2\x80\x94 当友元函数声明 (14.5.4)、显式实例化 (14.7.2) 或显式特化 (14.7.3) 引用函数模板特化时。
\n\n2 部分排序通过依次转换每个模板(请参阅下一段)并使用函数类型执行模板参数推导,选择两个函数模板中的哪一个更专业。推导过程确定其中一个模板是否比另一个更专业。如果\n 是这样,则部分排序过程会选择更专门的模板。 \n
\n