Можете ли вы побить бит в С++?

Я использую код другого пользователя, который был написан старым компилятором, который сопоставил специальный тип 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, независимо от того, что с правой стороны.