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

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

本文关键字:引用 bool gt back lt VC++ 说明符      更新时间:2023-10-16

在使用自动规范符上创建一个用vector<bool>::back()初始化的返回值的变量,该变量具有参考资格。

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不返回引用,而是允许访问向量中的单个位的特殊参考代理对象。由于它是代理人,因此可以做一些正常引用无法做到的其他事情 - 例如检查引用位是否仍然存在。不过,这仅在调试构建中发生(我希望)。

您的问题是由代理对象可复制的事实引起的,并且auto变量愉快地获取了参考代理的副本,而正确的参考将由编译器删除,并且该变量将是引用值的副本。