我在我正在开发的项目的源代码上运行PCLint时发现了这个例子。这里是代码片段:这是为什么编译,并且是否有编译器开关可以让编译器报告它为错误或警告?
QString foo()
{
return false;
}
我编译了代码,并验证它返回一个空字符串。真正的例子是一大类大的方法,以及地方在一些偏远如果分支,有这个与世隔绝的
return false;
好吧,这是坏的编码,可耻的开发(通过使用SVN /怪我所能甚至找出是谁做的:-)),但是,严重的是,为什么编译器不会抱怨呢?
我的理论是,编译器将
return false;
到
return QString(((const char *) false));
不过,我没有看到所有的编译器来推断这个执行的基本步骤。它首先尝试QString的所有构造函数,并发现
QString(const * char);
但是呢?它如何确定它可以从布尔到const char *。或者它是否会在你使用一个指针所在的布尔的任何时候自动地将一个布尔值转换为任何指针类型?
问题的第二部分。由于所有这些隐式类型转换都是相当危险的(为什么开发人员会写'return false',如果它们意味着“返回一个空字符串”?),有没有办法(例如编译器开关),以至少报告这种情况作为警告?我试过了 - 用g ++编译,并没有打印任何警告。
编辑
谢谢你的提示。虚假似乎有特殊待遇。如果我做
return true;
我得到:
error: conversion from ‘bool’ to non-scalar type ‘QString’ requested
我使用G ++ 4.4.3在Ubuntu。正如在不同的评论中指出的那样,其他编译器报告了这个问题。
铿锵有关它的警告,有一个这样的情况。 – Dani
GCC(至少4.5)**没有**警告它。 – Mat
在这里为'explicit'构造函数插入插件。 –