为什么宏__STL_FUNCTION_MPL_PARTIAL_ORDER应该将模板函数包含在std_pair.h中

why should the macro __STL_FUNCTION_TMPL_PARTIAL_ORDER enclose the template function in std_pair.h

本文关键字:包含 函数 pair std FUNCTION STL MPL PARTIAL 为什么 ORDER      更新时间:2023-10-16

今天我在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 */

我不认为模板函数与部分专业化有任何关联函数模板的。我错了吗?

编译器如何处理函数调用

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

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

  • 核心C++,第1个,共n个
  • 核心C++,第2个,共n个
  • 核心C++,n中的3个

标准一瞥

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

//*__STL_FUNCTION _TMPL_PARTIAL_ORDER:如果编译器支持//函数模板的部分排序。(又称部分函数模板的专门化//。)

要了解函数模板的部分排序的用途,这里有一段引文(如果你读了这本书并观看了链接的视频,它会变得更加清晰)。

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

1如果函数模板过载,则函数模板的使用专业化可能不明确,因为模板参数推导(14.8.2)可以将功能模板专业化与更多多个函数模板声明过载的部分排序函数模板声明在以下上下文中使用选择函数模板要指向的函数模板专业化是指:

--在对的调用的过载解决过程中功能模板专业化(13.3.3);

--当采用函数模板专业化;

--当放置操作符选择要匹配的函数模板专用化的delete新的放置操作员(3.7.4.2、5.3.4);

--当朋友函数声明(14.5.4)、显式实例化(14.7.2)或显式专门化(14.7.3)是指函数模板专业化

2偏序选择两个函数中的哪一个通过转换每个模板,模板比其他模板更专业依次使用模板(见下一段)并执行模板参数使用函数类型进行推导扣除过程决定其中一个模板是否比另一个更专业。如果因此,偏订购过程