почему макрос __STL_FUNCTION_TMPL_PARTIAL_ORDER должен содержать функцию шаблона в std_pair.h

Сегодня я вижу следующий код в 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 */

я не думаю, что функции шаблона имеют какую-либо связь с частичной специализацией
шаблонов функций.
я ошибся ?

5

Решение

Как обрабатывается вызов функции компилятором

Вызов шаблона функции в C ++ проходит через Святую Троицу Поиск имени (раздел 3.4 в Стандарте), Шаблон Аргумент Дедукция (раздел 14.8.2) и Разрешение перегрузки (раздел 13.3).

Помимо чтения этих разделов в Стандарт C ++, Вы можете прочитать об этом в отличной книге Шаблоны C ++: полное руководство, или посмотрите первые три видео Core C ++ Стефана Т. Лававея

Взгляд в стандарт

Как вы уже поняли, макрос изначально был в реализации STL SGI, в то время, когда еще не было стандарта C ++, и поддержка компилятором шаблонов функций была очень схематичной.

// * __STL_FUNCTION_TMPL_PARTIAL_ORDER: определено, если компилятор
поддерживает // частичное упорядочение шаблонов функций. (частичное
специализация // шаблонов функций.)

Чтобы узнать, для чего используется частичное упорядочение шаблонов функций, вот цитата (которая станет намного понятнее, если вы прочитаете книгу и посмотрите связанные видео).

14.5.6.2 Частичное упорядочение шаблонов функций [temp.func.order]

1 Если шаблон функции перегружен, использование шаблона функции
специализация может быть неоднозначной
потому что вычет аргумента шаблона
(14.8.2) может связать специализацию шаблона функции с более
чем одно объявление шаблона функции. Частичное упорядочение перегруженных
объявления шаблона функции используется
в следующих контекстах в
выберите шаблон функции, к которому относится шаблон функции
специализация относится
:

— во время разрешения перегрузки для вызова
специализация шаблона функции (13.3.3);

— когда адрес
принята специализация шаблона функции;

— когда оператор размещения
удалить, что специализация шаблона функции выбрана для соответствия
оператор размещения new (3.7.4.2, 5.3.4);

— когда функция друга
объявление (14.5.4), явное создание экземпляра (14.7.2) или
явная специализация (14.7.3) относится к шаблону функции
специализация.

2 Частичное упорядочение выбирает, какая из двух функций
шаблоны более специализированы, чем другие, преобразовывая каждый
шаблон по очереди (см. следующий абзац) и выполнение аргумента шаблона
удержание с использованием типа функции. Процесс удержания определяет
является ли один из шаблонов более специализированным, чем другой. Если
Итак, более специализированный шаблон выбирается частичным
процесс заказа
.

0

Другие решения

Других решений пока нет …