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