如果我有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')
答案 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。