vector <bool>是否违反了容器要求?</bool>

时间:2012-10-01 17:42:21

标签: c++ language-lawyer

23.2中的C ++标准草案n3242,在包含容器要求的表中,指出包含X::reference的容器的T必须为lvalue T。然而,对于vector<bool>vector<bool>::reference是另一个类,是访问存储在向量中的单个字节位的代理。

这是否意味着标准中定义的std::vector T = bool类模板规范无法满足容器要求?

4 个答案:

答案 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 。这个容器在世界范围内被认为是“标准化但失败的东西”。