C++, аргументы по умолчанию в параметрах шаблона

1,00
р.
Я изучаю книгу по программированию шаблонов C++ и встретил абзац, который вызвал у меня ряд вопросов, четкого ответа на которые я нигде не нашел.
Абзац касается аргументов по умолчанию в параметрах шаблона:
В принципе можно иметь аргументы по умолчанию для ведущих параметров шаблона функции, даже если за ними следуют параметры без аргументов по умолчанию:
template RT max(T1 a, T2 b) { return b < a ? a : b }
Я всегда считал, что аргументы по умолчанию должны идти в конце списка аргументов. Это и логично, потому что если они будут идти не в конце, тогда возникает неопределенность.
Мои вопросы заключаются в следующем:
Почему возможно исключение из этого правила? Только ли для шаблонов это позволено?

Ответ
Это несколько разные правила. Здесь T1 и T2 выводятся из переданных аргументов. Например:
auto L = max(1,'c')
Ясно, что T1=int, T2=char, а не указанный тип L - и есть long.
А вот если написать
auto L = max(1,'c')
то тем самым указываем, что RT - double. А тут
auto L = max(1,'c')
указаны явно (а не выводятся) и остальные типы.
Дело еще и в том, что при указании параметров типа вы должны указывать их по очереди, включая параметр по умолчанию. Например,
template RT vax(T1 a) { T2 b = 0 return b < a ? a : b }
и вызов
auto s = vax(2)
означают, что у вас RT - double, T1 - int, а не T1 - double, T2 - int, а RT - long, так что никакой неоднозначности тут нет... А код не скомпилируется, пока вы не укажете явно все три типа.
В случае обычных функций параметры без значений по умолчанию опущены быть не могут, в то время как в шаблоне - они могут быть выведены.