【问题标题】:Implicit conversion and calling a function隐式转换和调用函数
【发布时间】:2017-03-11 21:37:31
【问题描述】:

当我调用一个将参数作为 int 的函数,而我传递一个双精度参数时,在 C++ 中隐式转换有什么用?为什么这不是编译时错误?允许这种情况发生的运行时堆栈中发生了什么?

#include <iostream>
void foo(int num);

int main() {
    double doub= 4.9;
    foo(doub);
    return 0;
}

void foo(int num){
    std::cout<<num<<std::endl;
}

【问题讨论】:

  • 为什么这不是编译时错误? 回到 80 年代的编程语言不像现在那样类型安全。 C++ 向后兼容 C。
  • 运行时堆栈,什么都没有。您不希望在运行时这样做。你会放慢一切,只是为了捕捉几行糟糕的代码。提高编译器的警告级别,您应该会收到转换警告。
  • @user4581301 由于 int 和 double 大小相同,它不会与编译器混淆吗?有时像这样进行隐式转换是否有用?
  • @HamzaKhan:不,它们的大小不同 double 是 8 字节,而 int 仅为 4
  • 这里有一篇关于隐式转换的文章:link text

标签: c++ implicit-conversion


【解决方案1】:

这是 C++ 所做的所有implicit conversions 的长列表。这个特定的包含在以下内容中:

浮点-整数转换 浮点类型的纯右值可以转换为任何整数类型的纯右值。小数部分是 截断,即小数部分被丢弃。如果值 不适合目标类型,行为未定义(甚至 当目标类型为无符号时,模运算不会 申请)。如果目标类型是 bool,这是一个布尔转换 (见下文)。

【讨论】:

  • 感谢您的链接,但我想知道。允许隐式转换有什么用?在我看来,它只会让编译器变得更加棘手。为什么不现在就删除它?
  • @HamzaKhan40-一些年的代码会被破坏。像这样的变化会被非常小心地处理。如果您希望这是一个错误,请打开适合您的编译器的警告并设置警告是错误标志。
  • @HamzaKhan 从实践的角度来看,人们期望数字就是数字。他们希望将浮点数转换为整数以获取该数字的整数部分,并且他们希望将整数转换为浮点数以创建该整数的最接近的浮点表示。
猜你喜欢
  • 2013-11-02
  • 2017-08-28
  • 1970-01-01
  • 2014-11-15
  • 2018-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-21
相关资源
最近更新 更多