В стандарте 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 */
}
}
Нет, это не переносимый код. станд :: ИОС :: 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;
Других решений пока нет …