4

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

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

4

4 回答 4

10

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

是的。

同样,它的迭代器也不是真正的随机访问迭代器,因为会operator*产生一个代理对象。

vector<bool>是一个烂摊子。

于 2012-10-01T17:44:36.410 回答
7

是的,正如这里所说的,有一个很好的解释。

于 2012-10-01T17:45:06.183 回答
4

是的,vector<bool>不符合容器要求。它没有声称,尽管有相当明确的含义。问题是,容器“需求”不是任何形式意义上的需求。标准库中没有任何内容需要满足容器要求的类型。相反,“要求”是描述性的:每个容器的文档都可以说(就像 文档一样vector<bool>)“这个容器满足容器要求,除了……”。

于 2012-10-01T17:47:40.120 回答
1

是的,确实如此。首先,它使用代理对象vector <bool>::reference,它实际上不是一个引用,而只是看起来相同(它是一个类)。其次,它具有其他向量所没有的flip()方法。此外,与所有其他向量不同,它不支持转换为类 C 数组:&vec[0].

因此,实际上vector< bool>不是向量,但看起来像 vector ,它的数据不是bool,但看起来像bool。这个容器在世界范围内被认为是“标准化但失败的东西”。

于 2012-10-01T17:54:49.280 回答