Почему bool не меняется при побитовых операциях? C++

В C++ bool весит 1 байт. Я решил для изучения побитовых операций сделать программу, которая позволит хранить 8 значений True/False в одном bool (Практической пользы это не несет, это только для тренировки). И наткнулся на интересное поведение. Сначала приведу код:

#include <iostream>

using namespace std;

void setBool(bool &bb, int bit, bool setter) {

    bit--; // 1

    if (setter) { // true

        cout << "1: " << (bb | (1 << bit)) << "\n"; // Выводит 3, все верно
        bb |= (1 << bit); // 0000 0001 | 0000 0010 = 0000 0011

    }
    else {

        bb &= ~(1 << bit);

    }

}

int main() {

    bool bb = true; // 0000 0001

    setBool(bb, 2, true); // bb = 0000 0011

    cout << "2: " << bb << "\n"; // Выводит 1 !!

    system("pause");
    return 0;

}

При вызове функции и передаче ей переменной проверяется, хочу я установить 1 или 0 и в какой байт. Далее выбирается этот байт и если я хочу вставить 1, то выполняется побитовое "И" переменной с единицей, побитово сдвинутой влево на нужное число бит. И здесь начинается прикол. Если запихнуть Выражение (bb | (1 << bit)) в std::cout, то выведет закономерно 3. Однако после этого, если вывести саму переменную bb в консоль, то выведет 1. Почему?


Ответы (1 шт):

Автор решения: Harry

Потому что это же не int и не unsigned char, а bool.

Абелева переменная принимает два значения - false или true. Все, что не 0, превращается в true, а выводится как 1 - пока не зададите формат boolalpha.

Работайте с unsigned char. Хранить в bool - пусть оно и реализовано как unsigned char - 8 значений - некорректно. Кстати, компилятор при включенных предупреждениях должен был об этом сообщить.

→ Ссылка