Приведение типов при умолчательном значении аргумента шаблона

Сделал для рассмотрения этого вопроса наглядный код (см. ниже). В шаблоне функции fun1 тип T имеет умолчательное значение double. Пусть я вызываю эту функцию, передавая в качестве аргумента функции литерал 10 (у него тип int). Почему при явном указании типа аргумента шаблона double (в угловых скобках) при вызове функции у меня происходит преобразование типа int в тип double; если же явно не указывать (не писать угловые скобки), то тип останется int несмотря на то, что в шаблоне умолчательное значение double?

template <class T = double>
void fun1(const T& x)
{
    std::cout << sizeof(x);
}

int main()
{
    fun1(10); //тут sizeof = 4

    fun1<double>(10); //тут sizeof = 8
   
    return 0;
}

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

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

Происходит вывод параметра шаблона функции из типа аргумента. Указанное значение параметра шаблона по-умолчанию будет использоваться в контексте, где не применяется вывод из типов аргументов, например при взятии адреса функции:

(*&fun1<>)(10); //тут sizeof = 8
→ Ссылка