Выбор ответа Senior Контейнеры STL изнутри обновлено

Особенность vector<bool>

Вопрос

Почему bool& r = v[0]; не компилируется для std::vector<bool> v(10);?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Биты упакованы, и operator[] возвращает прокси, а не bool&. Специализация std::vector<bool упакована по биту на элемент, на отдельный бит ссылку не взять, поэтому operator[] возвращает std::vector<bool::reference.

Варианты ответа

  1. Элементы vector нельзя брать по неконстантной ссылке
  2. Вектор v пустой, поэтому v[0] не может вернуть ссылку
  3. bool нельзя хранить в контейнерах как отдельный элемент
  4. Биты упакованы, и operator[] возвращает прокси, а не bool&правильный ответ

Разбор

Специализация std::vector<bool> упакована по биту на элемент, на отдельный бит ссылку не взять, поэтому operator[] возвращает std::vector<bool>::reference. Это ломает обобщённый код и делает невозможной безопасную запись в разные элементы из разных потоков. Альтернативы: std::vector<char>, std::bitset, std::deque<bool>.

  • Для других типов ссылка на элемент берётся нормально.
  • Размер 10 задан, вектор не пуст.
  • Хранить bool можно, проблема в специализации.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.