错误:从'std :: vector <bool> :: reference {aka std :: _ Bit_reference}'类型的右值开始,无效初始化'bool&amp;'类型的非const引用

时间:2015-05-21 14:01:13

标签: c++ vector stl lvalue rvalue

为什么我会收到错误:'std :: vector :: reference {aka std :: _ Bit_reference}'类型的右值的'bool&amp;'类型的非const引用的无效初始化?

vector<vector<bool>> vis;
bool& visited(int x, int y)
{
    return vis[x][y]; //error
}

据我所知,vector中的operator []返回引用,所以它应该是一个左值,但它不起作用。我该怎么做才能让它发挥作用?

2 个答案:

答案 0 :(得分:13)

那是因为std::vector< bool >不是它的样子。

对于std::vector类型为bool专门化 - 它是空间优化的,并为每个元素使用一个位。

如果您需要此功能,可以尝试使用uint8_t或类似的内容。或者只返回bool,而不是bool&

operator[]返回的引用不是标准引用,而是代理类,这会使这里的内容变得复杂。

这里有很多类似的问题:

等等。阅读有关std::vector< bool >专业化的更多信息。

答案 1 :(得分:6)

通常情况下,除了vector<T>之外,还有vector<bool>字样的情况。最初的C ++ 98标准将其指定为位打包向量,因此不可能对单个元素进行引用。

此后被认为是一个不方便的错误,但向后兼容性意味着它现在无法改变。