Если существует неявное преобразование между типом аргумента и типом, передаваемым в функцию, тогда аргумент будет преобразован.Если его нет, например, попытка передать std::list
в функцию, которая ожидает std::vector
, то этого не произойдет, и вы получите ошибку.
Одна из причин использовать определенный литерал,например, func(5.0)
или func(5UL)
, если func
является функцией шаблона или перегружена.Если func
является шаблоном или перегружен (для соответствующих типов), то func(5.0)
, func(5UL)
и func(5)
будут генерировать / вызывать 3 разные функции.Один для double
, один для unsigned long
и один для int
.Это может иметь смысл, поскольку могут быть специализации / перегрузки, обрабатывающие эти типы по-разному.
Вы также можете встретить такие случаи, как std::accumulate
, третий параметр которых, аккумулятор, имеет свой собственный тип шаблона.Допустим, вы хотите суммировать все элементы в std::vector<double>
.Если вы используете
std::accumulate(vector.begin(), vector.end(), 0)
, то вы получите результат, отличный от
std::accumulate(vector.begin(), vector.end(), 0.0)
, потому что при первом вызове используется int
для хранения суммы, которая будет урезаться каждый раз, апоследний использует double
, и вы получите ожидаемый результат.