【问题标题】:Prevent implicit conversion from bool to char防止从 bool 到 char 的隐式转换
【发布时间】:2020-12-30 21:13:11
【问题描述】:

我注意到在 C++ 中 bool 被隐式转换为 char。我意识到它们都存储为 1 个字节,但它们是根本不同的类型。是否有一些编译器标志或我可以设置的东西来防止两者之间的隐式转换? char 被自动转换为 bool 是有道理的,但反之则不然。

例如,以下是有效的:

char test = true;

我正在使用带有 C++17 的 Xcode

【问题讨论】:

  • "char 被自动转换为 bool 是有意义的,但反过来就不行。" 你确定吗?好像和我相反。每个bool 都适合char,但反之则不然。
  • 你用什么编译?
  • @TedLyngmo 抱歉错过了阅读您的评论并没有意识到您引用了 OP。
  • char test = strict<char>(true); 将无法编译。只需要制作strict 模板类,它不允许任何非该类型的东西。
  • 我认为最好的答案是:接受它。这是 C++ 很久以前做出的选择。这不是很好,但与它对抗更糟糕。

标签: c++ char boolean implicit-conversion


【解决方案1】:

此转换是 C++ 标准(integral conversions 的一部分)强制执行的,因此无法禁用此转换并保持兼容的 C++ 编译器。

编译器可能会提供不合规的扩展,但对于这样的事情,他们可能更喜欢警告而不是不合规。但是,我找不到提供此类警告的编译器(例如,请参阅No warning for implicit cast of bool to floating type)。

不过,答案可能以非编译器工具的形式存在。看起来clang-tidy 包含a check for implicit conversions from bool

【讨论】:

    【解决方案2】:

    根据@Eljay 的评论,这是一个可能的解决方案:

    template<typename T, typename U>
    T strict(U u)
    {
        static_assert(std::is_same_v<T, U>);
        return u;
    }
    

    然后你可以像这样使用它:

    char test  = strict<char>(true);  // error
    char test  = strict<char>('a');   // ok
    

    这是demo

    【讨论】:

    • 不错!这比我拼凑起来的更干净、更简单。
    【解决方案3】:

    char是int,所以转换没问题。

    如果您不希望这种情况发生,您可以使用相同的名称执行函数,但使用 bool 作为参数。你只能做定义,所以如果你用 bool 调用它,它会编译但不会链接。

    我一上电脑就会给你看例子

    【讨论】:

      猜你喜欢
      • 2011-10-24
      • 1970-01-01
      • 1970-01-01
      • 2019-06-28
      • 1970-01-01
      • 2016-07-09
      • 1970-01-01
      • 1970-01-01
      • 2016-06-27
      相关资源
      最近更新 更多