为什么分离分配运算符| =不适用于布尔的向量
Why does the disjunction assignment operator |= not work with vectors of bools?
如果我有 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。
相关文章:
- OpenGL - 在 NDC 中计算位置适用于着色器,但不适用于'regular'程序
- 使用模板参数重载C++方法:如何使其适用于模板的子类?
- 如何修复我的最大公约数代码?它适用于除零和零以外的所有数字
- 选择排序C++(已修改)并非适用于所有情况
- 创建类似于布尔值的变量类型
- 无法让"std::enable_if"适用于无作用域枚举
- 请找出我的代码中的错误,它在提交得到错误答案的同时仍然适用于我的所有测试用例
- 确定夏令时是否适用于特定日期
- 是否有一种 STL 算法可以最后找到,但它也适用于指针?
- QT 样式表主题,适用于使用属性选择器的整个应用程序
- C++带有适用于左值和右值的引用参数的函数
- 代码适用于调试,但不适用于发布
- C++17 和更新的 std::分配器是否适用于动态数量的自定义堆?
- 适用于大型数组的无复制线程安全环形缓冲区
- NRVO 是否也适用于协程?
- 约束包容是否仅适用于概念?
- 程序只适用于包含(无副作用)cout声明
- 适用于频繁更改的大型数据集的最佳数据结构
- 相同的 for 循环适用于其他项目,但不适用于此项目。为什么?
- 无法让 FastNoise 适用于草地