В C ++, когда я передаю значение в функцию, всегда ли оно преобразуется в соответствующий тип? - PullRequest
0 голосов
/ 21 сентября 2018

Если у меня есть такая функция, как void func(size_t x), и я вызываю функцию func(5), сразу ли преобразуется 5 в тип size_t?Действительно ли это справедливо для всех типов?

Я спрашиваю, потому что клянусь, я видел, как люди пишут код, где они делают такие вещи, как func(5.0) (передавая 5 как двойное) или func(0UL) (передавая 0 какбез знака длинный int).Это действительно необходимо?Разве мы не можем просто передать то, что хотим, и C ++ будет воспринимать это как тип, который я использовал для определения функции?

1 Ответ

0 голосов
/ 21 сентября 2018

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

...