使用自动说明符创建一个使用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,则自动说明符也适用于vector。

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

最佳答案

vector<bool>是一种特殊的野兽,根本不是一种 vector 。 back不返回引用,而是返回一个特殊的引用代理对象,该对象允许访问 vector 中的单个位。由于它是代理,因此它可以做普通引用不能做的其他事情-例如检查引用的位是否仍然存在。不过,这只会在调试版本中发生(我希望如此)。

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

关于c++ - VC++自动说明符假定vector <bool>::back的引用限定符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41298986/

10-11 22:31
查看更多