在C++中,当我将值传递给函数时,它是否总是转换为适当的类型?

jen*_*bo5 5 c++ types function type-conversion literals

如果我有一个函数void func(size_t x),我调用该函数func(5),是5立即转换为size_t类型?这通常适用于所有类型吗?

我问,因为我发誓我已经看到人们编写代码,他们做的事情func(5.0)(传递5作为双)或func(0UL)(传递0作为无符号长整数).这真的有必要吗?我们不能只是传入我们想要的东西,C++会把它当作我用来定义函数的类型吗?

Nat*_*ica 6

如果参数类型和传递给函数的类型之间存在隐式转换,则转换参数.如果没有一个,比如尝试将a传递std::list给期望a的函数std::vector那么它将不会,并且你将得到一个错误.

使用特定文字的一个原因,如func(5.0)或是func(5UL)if func是模板函数,还是重载.如果func是一个模板或是否超载(适当的类型),那么func(5.0),func(5UL)func(5)将产生/调用3种不同的功能.一个用于a double,一个用于a unsigned long,一个用于a int.这可能是有意义的,因为可能存在以不同方式处理这些类型的特化/重载.

您还遇到了std::accumulate第三个参数(累加器)具有自己的模板类型的情况.让我们说你要总结一个元素中的所有元素std::vector<double>.如果你使用

std::accumulate(vector.begin(), vector.end(), 0)
Run Code Online (Sandbox Code Playgroud)

那么你会得到一个不同的结果

std::accumulate(vector.begin(), vector.end(), 0.0)
Run Code Online (Sandbox Code Playgroud)

因为第一次调用使用a int来存储每次都会截断的和,而后者使用a double,你将获得预期的结果.