我做了一些测试operator &=.如以下示例所示,这适用于单一bool类型和vector<int>类型,但不适用vector<bool>.
#include <vector>
int main (){
bool a, b;
a &= b; // ok
std::vector<bool> c(1);
c[0] &= b; // error
c[0] = c[0] & b; // ok
std::vector<int> d(1);
d[0] &= b; // ok
return 0;
}
Run Code Online (Sandbox Code Playgroud)
谁能告诉我们这里发生了什么?
(我正在使用gcc 4.4.3)
文章说
(如果有其他人写过矢量,它会被称为"不合格"和"非标准".嗯,这是标准的,所以这使得它更难称之为这些名称,但我们中的一些人尝试无论如何希望它最终会得到清理.正确的解决方案是去除向量专业化要求,这样向量确实是普通旧bool的向量.此外,它主要是多余的:std :: bitset是为这种类型设计的事情.)....
std :: vector不合格的原因是它为了优化空间而在底层提取技巧:而不是为每个bool存储一个完整的char或int(占用空间的至少8倍,在8-的平台上) bit chars),它包含bool并将它们作为单独的位(内部,比如,字符)存储在其内部表示中.这样做的一个结果是它不能只返回正常的bool及其运算符[]或其解除引用的迭代器[2]; 相反,它必须玩一个类似bool的助手"代理"类游戏,但绝对不是一个bool.不幸的是,这也意味着访问向量的速度较慢,因为我们必须处理代理而不是直接指针和引用.
这样做的原因是vector<bool在标准中明确地调出了>,每个项目只占一位.
这样做的结果是,operator[]对于vector<bool>返回的代理对象,而不是像其他包含的类型的直接引用.然后代理对象不支持operator&=(尽管我没有引用,但最有可能是每个标准).
deque<bool>如果要为每个项目使用一个字节并让操作符按预期工作,则可以使用.