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

Gio*_*gio 5 c++ qt g++

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

Mar*_*som 7

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

我很惊讶的是,编译器允许这是一个单步转换,并没有认为这是一个两步的转换,从booleanint,然后intchar*-两步转化不会隐式进行.

  • `bool`是一个整数类型,`false`转换为0并且是常量,你可以将空指针的常量积分表达式转换为0.(这不适用于`true`;`true`转换为1,并且没有特殊的指针意义.) (2认同)