Приведение типов при умолчательном значении аргумента шаблона
Сделал для рассмотрения этого вопроса наглядный код (см. ниже). В шаблоне функции 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 шт):
Происходит вывод параметра шаблона функции из типа аргумента. Указанное значение параметра шаблона по-умолчанию будет использоваться в контексте, где не применяется вывод из типов аргументов, например при взятии адреса функции:
(*&fun1<>)(10); //тут sizeof = 8