如果我有一个类似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/