C ++ стандартный проект n3242 в 23.2 в таблице, содержащей требования к контейнерам, говорится, что X::reference
для контейнера, содержащего T
должно быть lvalue T
, Тем не менее, для vector<bool>
, vector<bool>::reference
это другой класс, прокси для доступа к отдельным битам байтов, хранящихся в векторе.
Означает ли это, что std::vector
спецификация шаблона класса для T = bool
, определенный в стандарте, не соответствует требованиям контейнера?
Означает ли это, что
std::vector
спецификация шаблона класса дляT = bool
, определенный в стандарте, не соответствует требованиям контейнера?
Да.
Точно так же его итераторы не являются итераторами с произвольным доступом, потому что operator*
дает объект прокси.
vector<bool>
беспорядок.
Да, как указано Вот с хорошим объяснением.
Да, vector<bool>
не соответствует требованиям контейнера. Он не претендует на это, хотя есть довольно четкое следствие. Дело в том, что «требования» контейнера не являются требованиями в каком-либо формальном смысле; в стандартной библиотеке нет ничего, что требовало бы типа, соответствующего требованиям контейнера. Скорее, «требования» носят описательный характер: каждая документация контейнера может сказать (как и документация для vector<bool>
) «этот контейнер соответствует требованиям контейнера, кроме …».
Да, это так. Во-первых, он использует прокси-объект vector <bool>::reference
который на самом деле не является ссылкой, а только выглядит одинаково (это класс). Во-вторых, это кувырок() метод, которого нет у других векторов. Кроме того, он не поддерживает преобразование в C-подобный массив в отличие от всех других векторов: &vec[0]
,
Итак, на самом деле вектор< BOOL> не является вектором, но выглядит как вектор, а его данные не являются BOOL но похоже BOOL. Этот контейнер во всем мире считается «стандартизированной, но неудачной вещью».