为什么非常量<bool>向量元素是常量?
Why are non-const vector<bool> elements const?
当我迭代一个vector<bool>
时,我发现通过迭代器取消引用的元素被识别为常量。为什么?更改容器或元素类型,例如 list<bool>
或 vector<short>
,并且元素是非常量元素。这段代码显示了我在说什么:
typedef bool T;
#define C vector
istringstream &operator>>(istringstream &iss, T &v)
{
cout << "non-const" << endl;
return iss;
}
istringstream &operator>>(istringstream &iss, const T &v)
{
cout << "const" << endl;
return iss;
}
istringstream &operator>>(istringstream &iss, C<T> &c)
{
for (C<T>::iterator it = c.begin(); it != c.end(); ++it)
{
iss >> *it;
}
return iss;
}
int main()
{
C<T> c(1);
istringstream iss("1");
iss >> c;
}
对于vector<bool>
,该程序将"const"打印到控制台。将顶部的 typedef 和 manifest 常量更改为这两个组合以外的任何内容,它会打印"non-const"。另外,如果我用 T v; iss >> v; *it = v;
替换行 iss >> *it
,它会按预期工作——所有组合都打印"非常量"。
我在GCC 4.1.2 C++98(通过 codepad.org(和VS2015 C++14+(?(中看到相同的行为。
尽管名称如此,但vector<bool>
不包含bool
,并且取消引用其迭代器不会给您带来bool&
。相反,它为您提供了一个类型 vector<bool>::reference
,它试图尽可能地模仿bool&
的行为。
没有办法将vector<bool>::reference
转换为bool&
,因此非常量重载不起作用。 然而,vector<bool>::reference
可以转换为bool
,然后可以绑定到const bool&
。
为了节省内存,vector<bool>
不是实际的bool
数组。布尔值只需要存储一位,但可能的最小大小是 1byte = 8 位。因此,通过不使用简单的实现,您可以拥有比简单的布尔数组提供的 8 倍高效的存储(就内存而言(。
然而,结果是vector<bool>
的元素不是布尔值,而是一个与bool&
几乎但不完全相同的vector<bool>::reference
。大多数操作都在这里,但有些不是(例如|=
示例(
您仍然可以将其转换为bool
,或者使用它初始化一个新的const bool
对象...并用这个新对象做任何你做的事情
std::vector<bool>
是std::vector
的专用化,它充当空间效率的动态位集。从 begin()
end()
返回的迭代器实际上指向表示布尔值的代理类类型的对象。
取消引用迭代器返回的引用是类类型的 prvalue,而不是实际的布尔值。它被转换为bool
类型的 prvalue,因此这就是为什么引用 const 的重载被引用的原因(右值可以绑定到对 const 的引用(。
- 如何在 c++ stl 中获取列表中被推回的元素的地址,在常量时间内?
- 是否可以使用 new 指定具有宏常量的动态分配数组的元素?
- 常量数组如何在每个元素中只能包含字符,而 char* 数组能够指向每个元素中的字符串?
- 常量映射和常量元素映射之间的区别
- 如何打印出常量字符串的第一个元素?
- 如何从模板获取常量矢量元素的引用
- 使用常量键从集合中擦除元素
- 返回对私有向量成员元素的非常量引用是否是一种不好的做法
- 使用对另一个元组不同类型的元素的非常量引用来初始化元组的元素
- 通过const_cast修改常量 std::vector 的元素<T>
- 对列表中的任意元素的常量时间访问 (C++)
- 错误推回对常量向量元素的引用
- 常量时间更改数组的前 k 个元素(C++)
- 如果 QList 实例是常量,是否意味着每个元素都是常量
- 如何删除类型名中每个元素的常量引用修饰符.T.
- 如何调用 boost multi_index元素的非常量成员函数
- 标准::矢量元素中的常量引用
- 常量向量暗示常量元素
- 从常量迭代器到映射向量,获取映射向量中映射元素的键和值
- 在重载中返回常量元素