До C ++ 14 std::greater<T>
был шаблоном класса, основанным на одном явном параметре типа T
.Это позволило только сравнить два равных типа.В противном случае при сравнении разных типов нужно было полагаться на преобразование, которое может не сработать в процессе вывода аргументов шаблона.
Это было исправлено в C ++ 14 в том смысле, что теперь также существует общее сравнение.двух разных типов.Вместо использования нового шаблона класса std::greater<T,U>
(который, возможно, не будет обратно совместим и, конечно, также более сложен), используется специализация std::greater<void>
, которой не было до C ++ 14.Тип void
выбран именно по этой причине: поскольку он никогда не использовался до C ++ 14 - сравнение void
s не имеет смысла - автоматически получается обратная совместимость и даже избегается введение нового шаблона класса.
Как описано в справочнике , std::greater<void>
теперь является функтором, содержащим шаблон функции operator()
, аналогичный
template< class T, class U>
constexpr auto operator()( T&& lhs, U&& rhs ) const
{
return std::forward<T>(lhs) > std::forward<U>(rhs);
}
. Это реализует общее сравнение между двумятипы (и это почти то же самое, что можно было бы придумать в настоящее время).