Я изучаю книгу по программированию шаблонов 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, так что никакой неоднозначности тут нет... А код не скомпилируется, пока вы не укажете явно все три типа. В случае обычных функций параметры без значений по умолчанию опущены быть не могут, в то время как в шаблоне - они могут быть выведены.