为什么C++允许从int到unsigned int的隐式转换?

Nef*_*efX 17 c++

考虑以下代码:

void foo(unsigned int x)
{

}

int main()
{
  foo(-5);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译没有问题.像这样的错误可能会导致很多问题并且很难找到.为什么C++允许这样的转换?

Mar*_*k B 21

简短的回答是因为C最初支持这样的转换,并且他们不想破坏C++中的现有软件.

请注意,一些编译器会对此发出警告.例如,g++ -Wconversion将警告该构造.

在许多情况下,隐式转换很有用,例如int在计算中使用时,但最终结果永远不会是负数(从算法中获知并且可选地在其上声明).

编辑:其他可能的解释:请记住,最初的C语言是一种比C++更宽松的语言.使用K&R样式函数声明,编译器无法检测到这种隐式转换,因此为什么要在语言中限制它.例如,您的代码看起来大致如下:

int foo(x)
unsigned int x
{

}

int main()
{
  foo(-5);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

而只有宣言本来就是 int foo(x);

编译器实际上依赖程序员将正确的类型传递给每个函数调用,并且在调用站点没有进行任何转换.然后,当函数实际被调用时,堆栈上的数据(等)被解释为函数声明指示的方式.

一旦编写了依赖于那种隐式转换的代码,即使函数原型添加了实际类型信息,也很难将其从ANSI C中删除.这可能就是为什么它现在仍然存在于C中.然后C++出现并再次决定不破坏与C的向后兼容性,继续允许这种隐式转换.


Lig*_*ica 6

  • 只是另一种语言的怪癖,有很多愚蠢的怪癖.
  • 转换定义明确,以便在某些情况下有用.
  • 它与C向后兼容,由于上述原因,它就是这样做的.

随便挑选.