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