为什么析取赋值运算符| =不适用于bool向量?

Mee*_*ies 14 c++ assignment-operator

如果我有一个,vector<bool> vec_bool那么我无法使用|=赋值运算符修改向量的内容.就是这条线

vec_bool[0] |= true;
vec_bool[0] |= vec_bool[1];
Run Code Online (Sandbox Code Playgroud)

给出编译错误,而行

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];
Run Code Online (Sandbox Code Playgroud)

不要.这是什么原因?

给出的错误(通过gcc)是:

TEST.CPP:21:17:错误:不对应的 '运营商| ='(操作数的类型是 '的std ::矢量::参考{又名的std :: _ Bit_reference}' 和 '布尔')

Sto*_*ica 18

reference从返回operator[]std::vector<bool>是不是一个别名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
};
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,没有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并不是一个特别好的抽象.

  • @MeesdeVries - 这是C++标准要求偏离主要声明的唯一一个.您可以假设所有其他人都是主要模板. (6认同)
  • ...也就是说,其他人可能出于性能原因而专门,但你无法在便携式代码中检测到它. (3认同)