3

在 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 */    
    }
}
4

1 回答 1

3

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

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

如果 iostate 是根据后一种情况实现的,那么您的代码将无法编译,因为std::bitset既没有运算符 bool 也不能隐式转换为整数类型(如您的情况)。

注意:以下编译失败:

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

虽然这有效:

  std::bitset<8> b;
  return (b != 0) ? 1 : 0;
于 2012-10-07T22:23:28.453 回答