为什么宏__STL_FUNCTION_TMPL_PARTIAL_ORDER将std_pair.h中的模板函数括起来

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)

我不认为模板功能与功能模板的部分特化有任何关联.我错了吗 ?

Tem*_*Rex 0

编译器如何处理函数调用

\n\n

在 C++ 中调用函数模板要经历名称查找(标准中的第 3.4 节)、模板参数推导(第 14.8.2 节)和重载解析(第 13.3 节)的神圣三位一体。

\n\n

除了阅读C++ 标准中的这些部分之外,您还可以在优秀的《C++ 模板:完整指南》一书中阅读相关内容,或者观看 Stephan T. Lavavej 制作的前三个核心 C++ 视频

\n\n\n\n

标准一览

\n\n

正如您自己已经发现的那样,该宏最初是在 STL 的 SGI 实现中,当时还没有 C++ 标准,并且编译器对函数模板的支持非常粗略。

\n\n
\n

// * __STL_FUNCTION_TMPL_PARTIAL_ORDER:如果编译器支持 // 函数模板的部分排序,则定义。(又名函数模板的部分\n 特化。)

\n
\n\n

要了解函数模板的部分排序的用途,请参阅此处的引用(如果您阅读本书并观看链接的视频,这将变得更加清晰)。

\n\n

14.5.6.2 函数模板的部分排序 [temp.func.order]

\n\n
\n

1如果函数模板被重载,则函数模板特化的使用可能会不明确,因为模板参数推导 (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\n

2 部分排序通过依次转换每个模板(请参阅下一段)并使用函数类型执行模板参数推导,选择两个函数模板中的哪一个更专业。推导过程确定其中一个模板是否比另一个更专业。如果\n 是这样,则部分排序过程会选择更专门的模板。 \n

\n
\n