vector <bool> :: operator [] misbehavior?

Mr.*_*C64 7 c++ boolean vector auto c++11

可能重复:
为什么vector <bool> :: reference不返回对bool的引用?

我曾经认为,随着std::vector::operator[]我们获得被访问项目的深层副本,但似乎并非总是如此.至少,使用vector<bool>以下测试代码会得到不同的结果:

#include <iostream>
#include <vector>
using namespace std;

template <typename T>
void Test(const T& oldValue, const T& newValue, const char* message)
{
    cout << message << '\n';

    vector<T> v;
    v.push_back(oldValue);
    cout << " before:  v[0] = " << v[0] << '\n';

    // Should be a deep-copy (?)       
    auto x = v[0];   
    x = newValue;

    cout << " after:   v[0] = " << v[0] << '\n';
    cout << "-------------------------------\n";
}

int main()
{
    Test<int>(10, 20, "Testing vector<int>");
    Test<double>(3.14, 6.28, "Testing vector<double>");
    Test<bool>(true, false, "Testing vector<bool>");
}
Run Code Online (Sandbox Code Playgroud)

输出(使用VC10/VS2010 SP1编译的源代码):

Testing vector<int>
 before:  v[0] = 10
 after:   v[0] = 10
-------------------------------
Testing vector<double>
 before:  v[0] = 3.14
 after:   v[0] = 3.14
-------------------------------
Testing vector<bool>
 before:  v[0] = 1
 after:   v[0] = 0
-------------------------------
Run Code Online (Sandbox Code Playgroud)

我本来预计v[0] 之后x = newValue任务仍然是等于以前的值,但这似乎并非如此.这是为什么?为什么vector<bool>特别?

Pup*_*ppy 20

vector<bool>是一种可怕的憎恶和特殊.委员会专门用它来打包,因此它不支持正确的引用语义,因为你不能引用一点,这意味着它有一个不符合的接口,实际上不符合标准容器的条件.大多数人使用的解决方案只是永远不会使用vector<bool>.


sel*_*tze 6

vector<bool>::operator[]既不会产生bool也不会引用a bool.它只返回一个像引用一样的小代理对象.这是因为没有对单个位的引用,并且vector<bool>实际上bool以压缩方式存储s.所以通过使用auto你刚刚创建了类似引用的对象的副本.问题是C++不知道这个对象充当引用.你必须更换,以迫使"衰变的值"在这里autoT.