Как это работает, автоматически ли он выдает шаблон объекта? Зачем нужно писать <> в конце типа? Могу ли я удалить <>, и он будет таким же?
Ответ 1
Обычно это можно использовать и работает, когда первый и следующий или единственный параметр имеет аргумент шаблона по умолчанию (тип или значение, если он является интегралом). Дополнительный случай - это когда существует пакет аргументов шаблона и он пуст.
<> по-прежнему необходимо идентифицировать его как тип шаблона.
template <class RealType = double>
class uniform_real_distribution;
Следовательно, значение по умолчанию RealType для класса шаблона uniform_real_distribution равно double. Он равен std::uniform_real_distribution<double>.
Что касается С++ WD n4527, §14.3/4 (аргументы шаблона)
Когда используются шаблоны аргументов шаблона или аргументы шаблона по умолчанию, список шаблонов шаблонов может быть пустым. В этом случае пустые скобки <> все равно должны использоваться как список шаблонов-аргументов. [Пример:
template<class T = char> class String;
String<>* p; // OK: String<char>
String* q; // syntax error
template<class ... Elements> class Tuple;
Tuple<>* t; // OK: Elements is empty
Tuple* u; // syntax error
- конец примера]
Ответ 2
Класс имеет следующее объявление
template<class RealType = double>
class uniform_real_distribution;
Как вы видите, у него есть аргумент шаблона по умолчанию типа double