23.2中的C ++标准草案n3242,在包含容器要求的表中,指出包含X::reference
的容器的T
必须为lvalue T
。然而,对于vector<bool>
,vector<bool>::reference
是另一个类,是访问存储在向量中的单个字节位的代理。
这是否意味着标准中定义的std::vector
T = bool
类模板规范无法满足容器要求?
答案 0 :(得分:10)
这是否意味着标准中定义的
std::vector
T = bool
类模板规范无法满足容器要求?
是
类似地,它的迭代器不是真正的随机访问迭代器,因为operator*
产生了一个代理对象。
vector<bool>
一团糟。
答案 1 :(得分:7)
是的,正如here所述,有一个很好的解释。
答案 2 :(得分:4)
是的,vector<bool>
不符合容器要求。它没有声称,尽管有一个相当明确的含义。问题是,容器“要求”不是任何正式意义上的要求;标准库中没有任何内容需要满足容器要求的类型。相反,“要求”是描述性的:每个容器的文档可以说(与vector<bool>
的文档一样)“这个容器符合容器要求,除了......”。
答案 3 :(得分:1)
是的,确实如此。首先,它使用代理对象vector <bool>::reference
,它实际上不是引用,但只是看起来相同(它是一个类)。其次,它具有其他向量所没有的 flip()方法。此外,与其他所有向量不同,它不支持转换为类C数组:&vec[0]
。
所以,实际上 vector&lt; bool&gt; 不是矢量,但看起来像矢量,其数据不是 bool ,但看起来像 bool 。这个容器在世界范围内被认为是“标准化但失败的东西”。