避免bool转换为double的g++警告标志

8
我正在寻找g++的一个警告编译选项,它可以防止将bool静默转换为double。这个答案与int转double的更广泛的问题有关。该问题在那里被驳回,因为它被认为是无损转换和完全合法的。然而,由于bool具有比简单整数更多的语义含义,我期望从bool到double的隐式转换会发出警告。我已经尝试了以下代码:-Wall -Wextra -pedantic -Wconversion,但没有成功(没有发出警告)。
#include <iostream>

int foo(double var){
   return static_cast<int>(var);
}

int main(){
   std::cout << foo(5) << std::endl;
   std::cout << foo(5.1) << std::endl;
   std::cout << foo(false) << std::endl; // here I want the warning
   return 0;
}

我使用的是g++ 4.9.2,但建议使用更高版本的回答也完全可以接受。
谢谢。


3
您可以对 foo 进行重载,使其接受一个布尔值参数,然后不实现这个重载。这将导致链接错误。如果您想要编译器错误,那么模板可以提供这种功能。 - john
1
这是一个针对特定情况的可能解决方案,但我正在寻找一种通用解决方案,可以防止意外转换。 - mikeraf
2个回答

8

这种方法与gcc无关,而是依赖于另一个工具:clang-tidy有一个readability-implicit-bool-conversion检查,会在这种情况下警告您。您需要一个单独的静态分析检查(根据您的代码库可能需要长时间运行),但它可以发挥作用:

clang-tidy --checks=readability-implicit-bool-conversion your-file.cpp

产出
[...] warning: implicit conversion bool -> 'double' [readability-implicit-bool-conversion]  

std::cout << foo(false) << std::endl; // here I want the warning
                 ^~~~~
                 0.0

2
感谢您提供的信息丰富的答案。我会再等待一天,看看是否有适当的g++答案。如果没有,我将接受您的答案作为最有帮助的。 - mikeraf

4
实际问题是从bool到int的隐式转换(随后又进行了第二次转换,变成double)。布尔类型是较晚才加入C++语言的,从语义上来看并没有与数字不同(就像没有真正的字符类型一样)。由于不存在类型缩小,因此很难找到警告条件。如果您有将bool转换为自定义类的选项(可能只是暂时性的),那么可以重载转换运算符。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接