在包含容器要求的表格中,C++标准草案n3242第23.2节声明,对于包含T的容器,X::reference必须是lvalue T。然而,对于vector,vector::reference是另一个类,它是用于访问存储在向量中的字节的单个位的代理。
这是否意味着,对于T=bool,在标准中定义的std::vector类模板规范未能满足容器要求?
这是否意味着,对于T=bool,在标准中定义的std::vector类模板规范未能满足容器要求?
这是否意味着标准中定义的
std::vector
类模板规范对于T = bool
无法满足容器要求?
是的。
同样地,它的迭代器不是真正的随机访问迭代器,因为 operator*
返回一个代理对象。
vector<bool>
很混乱。
vector<bool>
不符合容器要求。它并没有声称符合,尽管有一个相当明显的暗示。事实是,容器“要求”在任何正式意义上都不是要求;标准库中没有要求满足容器要求的类型。相反,“要求”是描述性的:每个容器的文档都可以说(就像vector<bool>
的文档一样)“这个容器符合容器要求,除了......”。是的,它确实如此。首先,它使用代理对象vector <bool> :: reference
,它实际上不是引用,但只是看起来相同(它是一个类)。其次,它有其他向量没有的flip()方法。此外,它不支持转换为类似C的数组,而所有其他向量都支持:&vec [0]
。
因此,实际上vector< bool>不是向量,但看起来像向量,它的数据不是bool,但看起来像bool。这个容器被全球认为是“标准化但失败的东西”。