Является ли вектор & lt; bool & gt; нарушать требования контейнера?

C ++ стандартный проект n3242 в 23.2 в таблице, содержащей требования к контейнерам, говорится, что X::reference для контейнера, содержащего T должно быть lvalue T, Тем не менее, для vector<bool>, vector<bool>::reference это другой класс, прокси для доступа к отдельным битам байтов, хранящихся в векторе.

Означает ли это, что std::vector спецификация шаблона класса для T = bool, определенный в стандарте, не соответствует требованиям контейнера?

4

Решение

Означает ли это, что std::vector спецификация шаблона класса для T = bool, определенный в стандарте, не соответствует требованиям контейнера?

Да.

Точно так же его итераторы не являются итераторами с произвольным доступом, потому что operator* дает объект прокси.

vector<bool> беспорядок.

10

Другие решения

Да, как указано Вот с хорошим объяснением.

7

Да, vector<bool> не соответствует требованиям контейнера. Он не претендует на это, хотя есть довольно четкое следствие. Дело в том, что «требования» контейнера не являются требованиями в каком-либо формальном смысле; в стандартной библиотеке нет ничего, что требовало бы типа, соответствующего требованиям контейнера. Скорее, «требования» носят описательный характер: каждая документация контейнера может сказать (как и документация для vector<bool>) «этот контейнер соответствует требованиям контейнера, кроме …».

4

Да, это так. Во-первых, он использует прокси-объект vector <bool>::reference который на самом деле не является ссылкой, а только выглядит одинаково (это класс). Во-вторых, это кувырок() метод, которого нет у других векторов. Кроме того, он не поддерживает преобразование в C-подобный массив в отличие от всех других векторов: &vec[0],

Итак, на самом деле вектор< BOOL> не является вектором, но выглядит как вектор, а его данные не являются BOOL но похоже BOOL. Этот контейнер во всем мире считается «стандартизированной, но неудачной вещью».

1
По вопросам рекламы [email protected]