Ответ 1
- - это функция шаблона
- - полная специализация предыдущей функции шаблона (не перегружает!)
- является перегрузкой функции
Вот выдержка из Стандарты кодирования С++: 101 Правила, рекомендации и лучшие практики:
66) Не специализируйте шаблоны функций
Специализация шаблонов функций никогда не участвует в перегрузке: поэтому любые специализированные записи, которые вы пишете, не будут влиять на используемый шаблон, и это противоречит тому, что интуитивно ожидало бы большинство людей. В конце концов, если бы вы написали функцию nontemplate с идентичной подписью вместо специализации шаблона функции, функция nontemplate всегда была бы выбрана, потому что она всегда считалась лучшим совпадением, чем шаблон.
В книге предлагается добавить уровень косвенности путем реализации шаблона функции в терминах шаблона класса:
#include <algorithm>
template<typename T>
struct max_implementation
{
T& operator() (T& a, T& b)
{
return std::max(a, b);
}
};
template<typename T>
T& max(T& a, T& b)
{
return max_implementation<T>()(a, b);
}
См. также: