Можете ли вы побить бит в С++?
Я использую код другого пользователя, который был написан старым компилятором, который сопоставил специальный тип BOOL
с unsigned int
, но в моем компиляторе он сопоставлен с истинным BOOL
. В некоторых местах своего кода он использует оператор побитового сдвига <<
по типу BOOL
, который я никогда раньше не видел, и мой компилятор удивил меня, когда он не жаловался.
Является ли это допустимым С++? Получается ли BOOL
автоматически на int
или uint
?
Я видел этот связанный вопрос, который дал некоторую ясность по другой проблеме, но не касается операторов сдвига.
Ответы
Ответ 1
От Операторы сдвига [expr.shift]
Операнды должны быть целыми или неперечисленными типами перечислений, и проводятся интегральные продвижения. Тип результата - это результат продвинутого левого операнда
bool
является интегральным типом, поэтому код хорошо сформирован (bool
продвигается до int
, а результат - int
).
Из [conv.prom] мы покажем, какие целые числа, с которыми булевы получают повышение:
Значение типа bool
может быть преобразовано в prvalue типа int
, при этом false
становится равным нулю, а true становится one
Впоследствии сдвиг ведет себя нормально. (Спасибо, @chris)
Ответ 2
Тип результата смещения bool всегда является int, независимо от того, что с правой стороны.