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

时间:2017-10-03 09:47:15

标签: c++ assignment-operator

如果我有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:错误:'operator | ='不匹配(操作数类型为'std :: vector :: reference {aka std :: _ Bit_reference}'和'bool')

1 个答案:

答案 0 :(得分:18)

reference operator[]返回的std::vector<bool>不是bool&的别名,因为它是std::vector的主要专精。它由C++ standard as this

指定
// 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。