3

C ++標準ではstd::ios::openmode、、、std::ios::fmtflagsおよびstd::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 に答える