plo*_*ong 2 c++ boolean const vector extraction-operator
当我遍历a时vector<bool>,我发现通过迭代器解除引用的元素被识别为它们是const.这是为什么?更改容器或元素类型,例如list<bool>或vector<short>,并且元素是非const.这段代码显示了我在说什么:
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;
}
Run Code Online (Sandbox Code Playgroud)
因为vector<bool>,该程序将"const"打印到控制台.将顶部的typedef和manifest常量更改为除了这两个组合之外的任何内容,并打印"non-const".此外,如果我替换行,iss >> *it使用T v; iss >> v; *it = v;,它按预期工作 - 所有组合打印"非常量".
我在GCC 4.1.2 C++ 98(通过codepad.org)和VS2015 C++ 14 +(?)中看到了相同的行为.
尽管名称,vector<bool>包含没有bools,并且解除引用它的迭代器不会给你一个bool&.相反,它为您提供了一个类型的对象vector<bool>::reference,它试图模仿bool&尽可能多的行为.
没有办法将a转换vector<bool>::reference为a bool&,因此非const重载不起作用.vector<bool>::reference然而,可以转换为a bool,然后可以绑定到const bool&.
为了节省内存,vector<bool>不是一个实际的数组bool.bool值只需要存储一点,但可能的最小尺寸是1byte = 8bits.因此,通过不使用简单的实现,你可以有8倍的存储效率(就内存而言)然后是一个简单的bool数组.
然而,结果是a的元素vector<bool>不是bool而是a vector<bool>::reference几乎与a不完全相同bool&.大多数操作都在这里,但有些不是(例如|=)
你仍然可以将它转换为a bool,或const bool用它初始化一个新对象......并用这个新对象做任何事情