логический — C ++ поток битовой маски как bool?

В стандарте 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 */
}
}

3

Решение

Нет, это не переносимый код. станд :: ИОС :: iostate это Тип битовой маски который в соответствии со стандартом C ++ (17.5.2.1.3):

Каждый тип битовой маски может быть реализован как перечислимый тип, который перегружает определенные операторы, как целочисленный тип или как набор битов

Если iostate реализован в терминах последнего случая, ваш код не будет скомпилирован как станд :: BitSet не имеет ни оператора bool, ни неявно преобразуемого в целочисленный тип (как в вашем случае).

Замечания:
Следующее не компилируется:

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

пока это работает:

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]