为什么非const vector <bool>元素是const?

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 +(?)中看到了相同的行为.

T.C*_*.C. 6

尽管名称,vector<bool>包含没有bools,并且解除引用它的迭代器不会给你一个bool&.相反,它为您提供了一个类型的对象vector<bool>::reference,它试图模仿bool&尽可能多的行为.

没有办法将a转换vector<bool>::reference为a bool&,因此非const重载不起作用.vector<bool>::reference然而,可以转换为a bool,然后可以绑定到const bool&.


Amx*_*mxx 5

为了节省内存,vector<bool>不是一个实际的数组bool.bool值只需要存储一点,但可能的最小尺寸是1byte = 8bits.因此,通过不使用简单的实现,你可以有8倍的存储效率(就内存而言)然后是一个简单的bool数组.

然而,结果是a的元素vector<bool>不是bool而是a vector<bool>::reference几乎与a不完全相同bool&.大多数操作都在这里,但有些不是(例如|=)

你仍然可以将它转换为a bool,或const bool用它初始化一个新对象......并用这个新对象做任何事情