当我在我正在处理的项目的源代码上运行PCLint时,我找到了这个例子.这是代码片段:
QString foo()
{
return false;
}
Run Code Online (Sandbox Code Playgroud)
我编译了代码并验证它返回一个空字符串.真正的例子是一个大型类中的大型方法,并且在某个远程if分支的某个地方,有这个孤立的
return false;
Run Code Online (Sandbox Code Playgroud)
好吧,这是糟糕的编码,对开发人员感到羞耻(通过使用SVN/blame,我甚至可以找出谁做了这个:-))但是,严重的是,为什么编译器不抱怨?
我的理论是编译器翻译
return false;
Run Code Online (Sandbox Code Playgroud)
至
return QString(((const char *) false));
Run Code Online (Sandbox Code Playgroud)
但是,我没有看到编译器执行的所有基本步骤来推断它.它首先尝试QString的所有构造函数,然后查找
QString(const * char);
Run Code Online (Sandbox Code Playgroud)
但是之后?它如何确定它可以从bool转到const char*.或者,当你使用指向预期的bool时,它会自动将bool强制转换为任何指针类型吗?
问题的第二部分.因为所有这些隐式类型转换都非常危险(为什么开发人员会写'return false;'如果他们的意思是"返回一个空字符串"?),是否有办法(例如编译器切换)以便至少报告这种情况作为警告?我试过 - 用G ++打开它并没有打印任何警告.
编辑
谢谢你的提示.假似乎有一种特殊的待遇.如果我做
return true;
Run Code Online (Sandbox Code Playgroud)
我明白了:
error: conversion from ‘bool’ to non-scalar type ‘QString’ requested
Run Code Online (Sandbox Code Playgroud)
我在Ubuntu上使用g ++ 4.4.3.正如不同的评论所指出的,其他编译器报告了这个问题.
false等于零.Zero是一种表示NULL指针的特殊情况,并且会在没有警告的情况下强制转换为任何指针类型.
我很惊讶的是,编译器允许这是一个单步转换,并没有认为这是一个两步的转换,从boolean到int,然后int到char*-两步转化不会隐式进行.
| 归档时间: |
|
| 查看次数: |
1283 次 |
| 最近记录: |