В целях оптимизации памяти стандарт языка C++ называет vector<bool>
специальным стандартным контейнером, в котором каждый элемент bool использует только один бит памяти вместо того, чтобы занимать 1 байт, как занимает обычный bool. Ценой этой оптимизации является то, что этот контейнер не предоставляет всех возможностей и интерфейс, как это делает нормальный стандартный контейнер.
Т.к. мы не можем получить адрес отдельного бита в байте, такие вещи, как operator[] не могут вернуть bool&, а вместо этого возвращают прокси-объект, который позволяет манипулировать отдельным битом. Этот прокси не является типом bool&, вы не можете присвоить его адрес указателю с типом bool*, как вы могли бы сделать с "нормальным" контейнером. Это означает что bool &pb =v[0]
не является валидным кодом.