为什么分离分配运算符| =不适用于布尔的向量

Why does the disjunction assignment operator |= not work with vectors of bools?

本文关键字:适用于 布尔 向量 不适用 分离 分配 运算符 为什么      更新时间:2023-10-16

如果我有 vector<bool> vec_bool,那么我无法使用|=分配运算符修改向量的内容。也就是说,线

vec_bool[0] |= true;
vec_bool[0] |= vec_bool[1];

给出编译器错误,而行

bool a = false;
a |= true;
a |= vec_bool[0];
vec_bool[0] = vec_bool[0] | vec_bool[1];
vec_bool[0] = vec_bool[0] || vec_bool[1];
vector<int> vec_int(3);
vec_int[0] |= vec_int[1];

不要。这样做的原因是什么?

给出的错误(由GCC)为:

test.cpp:21:17:错误:"操作员| =’无匹配(操作数类型为'std :: vector :: coruest {aka std :: _ bit_reference}’和'bool'和'bool')

std::vector<bool>operator[]返回的reference不是bool&的别名,因为它是std::vector的主要专业化。它是由C 标准指定的:

// 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]

根据C 标准指定,std::vector<bool>不是特别好的抽象,IMO。