【问题标题】:g++ warning flag to avoid bool to double conversiong++ 警告标志,以避免布尔到双重转换
【发布时间】:2019-08-26 07:33:31
【问题描述】:

我寻找 g++ 的警告编译标志,它会阻止从 bool 到 double 的静默转换。

This answer 涉及更广泛的将 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,但建议使用更高版本的答案是完全可以接受的。
谢谢。

【问题讨论】:

  • 您可以重载foo 以获取布尔值,然后不实现重载。这将导致链接器错误。如果你想要编译器错误,那么模板可以给你。
  • 这是针对特定情况的可能解决方案,但我寻求一种通用解决方案来防止无意转换

标签: c++ compilation g++


【解决方案1】:

这是一种与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

【讨论】:

  • 感谢您提供的信息丰富的回答。我会再等一天,看看是否有合适的 g++ 答案。如果没有,我会接受你的作为最有帮助的。
【解决方案2】:

真正的问题是从boolint 的隐式转换(随后是到double 的第二次转换)。

布尔值是最近添加到 C++ 语言中的,从未真正认为在语义上与数字不同(就像没有真正的字符类型一样)。

由于没有缩小类型,因此很难找到警告条件。

如果您可以选择将布尔转换为自定义类(可能只是暂时的),您可以重载转换运算符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-04
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 2016-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多