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

标签 c++ function types type-conversion literals

如果我有一个类似void func(size_t x) 的函数并且我调用函数func(5),5 立即转换为size_t类型?这是否普遍适用于所有类型?

我问是因为我发誓我见过有人写代码,他们做类似 func(5.0)(将 5 作为 double 传递)或 func(0UL) (将 0 作为 unsigned long int 传递)。这真的有必要吗?我们不能随便传入任何我们想要的,C++ 会把它当作我用来定义函数的类型吗?

最佳答案

如果参数类型和传递给函数的类型之间存在隐式转换,则参数将被转换。如果没有,比如试图传递 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你会得到预期的结果。

关于c++ - 在 C++ 中,当我将一个值传递给一个函数时,它是否总是转换为适当的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52450363/

相关文章:

c++ - 关于内联函数的困惑

.net - 为什么类在 .Net 中默认不可序列化?

mysql - 如何确保 MySQL 列只接受 X 个字符?

vb.net - 关键字 'Shared' 在 VB.NET 中是什么意思?

c++ - 二进制解析器还是序列化?

c++ - 将 mwArray 转换为 std::vector<double>

c++ - 从 C++ 代码停止外部程序

java - 如何快速编写下面的changeValue函数?

c++ - 引用函数 "int &foo();"是如何工作的?

Javascript 变量范围和值