C++将位掩码流式传输为布尔值

C++ stream bitmask as bool?

本文关键字:传输 布尔值 掩码 C++      更新时间:2023-10-16

在C++标准中,std::ios::openmodestd::ios::fmtflagsstd::ios::iostate是实现定义的。但std::ios::goodbit被标准化为等于零。我的问题是:这些位掩码可以根据标准转换为布尔值吗?换句话说,要测试是否设置了错误标志,我们可以键入:

inline void myFunction(std::ios::iostate x = std::ios::goodbit) 
{
    if (x) { // <- is it ok or do I have to type "if (x != std::ios::goodbit)" ?
        /* SOMETHING */    
    }
}

不,这不是可移植代码。 std::ios::iostate是一种位掩码类型,根据C++标准(17.5.2.1.3):

每个位掩码类型都可以实现为重载某些运算符的枚举类型、整数类型或位集

如果 iostate 是按照后一种情况实现的,那么你的代码将无法编译为 std::bitset 既没有运算符布尔值,也不能隐式转换为整型类型(如你的情况)。

注意:以下内容编译失败:

  std::bitset<8> b;
  return (b) ? 1 : 0;

虽然这有效:

  std::bitset<8> b;
  return (b != 0) ? 1 : 0;