error: invalid initialization of non-const reference of type ‘bool&’ from an rvalue of type ‘std::vector<bool>::reference {aka std::_Bit_reference}’

error: invalid initialization of non-const reference of type ‘bool&’ from an rvalue of type ‘std::vector<bool>::reference {aka std::_Bit_reference}’

为什么我会收到错误:从类型为“std::vector::reference {aka std::_Bit_reference}”的右值对类型为“bool&”的非常量引用进行无效初始化?

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

据我所知 operator[] in vector returns 参考,所以它应该是一个左值,但它不起作用。我应该怎么做才能让它发挥作用?

通常情况下,对于 vector<T> 除了 vector<bool> 之外的所有 vector<T> 都是如此。最初的 C++98 标准将其指定为位压缩向量,因此不可能引用单个元素。

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

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

std::vector 有一个 specialization,类型为 bool - 它是 space 优化的,每个元素使用一个位。

如果您需要此功能,您可以尝试使用 uint8_t 或类似的东西。或者只是 return bool,而不是 bool&.

return由 operator[] 编辑的参考不是标准参考,而是代理 class,这使这里的事情变得复杂。

这里有很多类似的问题:

  • Why vector<bool>::reference doesn't return reference to bool?
  • Is the use of std::vector<bool> objects in C++ acceptable, or should I use an alternative?

还有其他人。详细了解 std::vector< bool > 专业化。