Выбор ответа Senior Контейнеры STL изнутри обновлено
Особенность vector<bool>
Вопрос
Почему bool& r = v[0]; не компилируется для std::vector<bool> v(10);?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Биты упакованы, и operator[] возвращает прокси, а не bool&. Специализация std::vector<bool упакована по биту на элемент, на отдельный бит ссылку не взять, поэтому operator[] возвращает std::vector<bool::reference.
Варианты ответа
- Элементы
vectorнельзя брать по неконстантной ссылке - Вектор
vпустой, поэтомуv[0]не может вернуть ссылку boolнельзя хранить в контейнерах как отдельный элемент- Биты упакованы, и
operator[]возвращает прокси, а неbool&правильный ответ
Разбор
Специализация std::vector<bool> упакована по биту на элемент, на отдельный бит ссылку не взять, поэтому operator[] возвращает std::vector<bool>::reference. Это ломает обобщённый код и делает невозможной безопасную запись в разные элементы из разных потоков. Альтернативы: std::vector<char>, std::bitset, std::deque<bool>.
- Для других типов ссылка на элемент берётся нормально.
- Размер 10 задан, вектор не пуст.
- Хранить bool можно, проблема в специализации.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.