使用自动说明符创建一个使用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/