Ответ 1
reference
, возвращаемый из operator[]
из std::vector<bool>
, не является псевдонимом для bool&
, как и для первичной специализации std::vector
. Это скорее указано стандартом С++ как это:
// bit reference:
class reference {
friend class vector;
reference() noexcept;
public:
~reference();
operator bool() const noexcept;
reference& operator=(const bool x) noexcept;
reference& operator=(const reference& x) noexcept;
void flip() noexcept; // flips the bit
};
И как вы можете видеть, не объявлено operator |=
. Поэтому вы не можете применить его к ссылке, возвращаемой с vec_bool[0]
.
Причина, по которой работает vec_bool[0] = vec_bool[0] | vec_bool[1];
, заключается в том, что есть вышеперечисленные перегрузки, которые облегчают ее. operator bool()
преобразует два операнда встроенного значения |
в значения bool
. А затем оператор присваивания reference
возвращает результат обратно в vec_bool[0]
.
Как указано стандартом С++, std::vector<bool>
не является особенно хорошей абстракцией, IMO.