Когда можно опускать шаблонные аргументы у класса?

Какое правило языка позволяет опускать шаблонные аргументы у классов? Когда это можно делать и что подставляется на место аргумента? Например, почему можно написать std::less<> здесь?

std::map<A, B, std::less<>>

Почему нельзя просто std::less?


Ответы (1 шт):

Автор решения: Chorkov

Значения параметров шаблона, можно опускать, если для этих параметров определены значения по умолчанию. (Также как и для аргументов функций.) Для std::less - значение по умолчанию - void начиная с с++14 . Т.е. std::less<> - конкретный тип данных эквивалентный std::less<void> но не эквивалентный std::less, который является шаблоном класса, а не классом. (std::map в качестве третьего аргумента требует именно конкретный тип данных, а не шаблон.)

Замечу, что специализация шаблона std::less<void>, также была введена в C++14, и она отличается от специализаций этого шаблона другими типами. В нем определена функция сравнения гетерогенный типов данных, (например, сравнение std::string со std::string_view), и не требует приведения к общему типу данных в промежуточных вычислениях, если в ищите в map по ключу, тип актуального значения которого отличается от типа, указанного в map.

→ Ссылка