VC++ 自动说明符假定 vector<bool>::back 的引用限定符

VC++ auto specifier assuming reference qualifier for vector<bool>::back

在使用自动说明符创建使用 vector<bool>::back() 中的 return 值初始化的变量时,该变量具有引用限定符。

int main()
{
    bool b = true;
    bool & j = b;
    auto k = j;
    k = false; // k is of int type. So, j and i are unaffected. 

    std::vector< bool > vec = { true };
    auto l = vec.back();
    vec.pop_back();
    l = false;  // I get a debug assertion here.
}

变量 k 的类型为 bool,但变量 l 的类型为 std::_Vb_reference<std::vector< bool, std::allocator< bool >>::_Alty >

如果我使用 int 而不是 bool,自动说明符也适用于矢量。

这是 VC++ 中的错误吗? 我正在使用 Microsoft Visual C++ 2013。

vector<bool> 是一种特殊的野兽,根本不是矢量。 back 不是 return 引用,而是一个特殊的引用代理对象,它允许访问向量中的单个位。由于它是一个代理,它可以做一些普通引用不能做的额外事情——比如检查引用的位是否仍然存在。不过,这只发生在调试版本中(我希望如此)。

您的问题是由于代理对象是可复制的,并且 auto 变量愉快地获取了引用代理的副本,而正确的引用将被编译器剥离并且变量将是引用值的副本。