为什么这会编译并且是否有任何编译器开关可以使编译器将其报告为错误或警告?

时间:2011-10-10 20:21:40

标签: c++ qt g++

当我在我正在处理的项目的源代码上运行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。正如不同的评论所指出的,其他编译器报告了这个问题。

1 个答案:

答案 0 :(得分:7)

false等于零。零是表示NULL指针的特殊情况,并且会在没有警告的情况下强制转换为任何指针类型。

我很惊讶编译器允许将其作为一步转换,并且不认为它是从booleanint的两步转换,然后是intchar* - 两步转换不是隐含的。