考虑以下代码:
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的向后兼容性,继续允许这种隐式转换.