VC++自动说明符假定向量的引用限定符::back
使用自动说明符创建一个变量,该变量使用vector::back的返回值初始化,该变量具有引用限定符VC++自动说明符假定向量的引用限定符::back,c++,c++11,visual-c++,reference,auto,C++,C++11,Visual C++,Reference,Auto,使用自动说明符创建一个变量,该变量使用vector::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.b
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::\u Vb\u reference>::\u Alty>
如果我使用int而不是bool,那么自动说明符也适用于向量
这是VC++中的一个bug吗?
我使用微软Visual C++ 2013。< /p> < p>向量是一种特殊的兽,而不是真的向量。back不返回引用,而是返回一个特殊的引用代理对象,该对象允许访问向量中的单个位。因为它是一个代理,所以它可以做一些普通引用无法做的额外事情,比如检查引用的位是否仍然存在。虽然我希望这只发生在调试版本中
您的问题是由于代理对象是可复制的,并且自动变量愉快地获取引用代理的副本,而编译器将删除适当的引用,并且变量将是引用值的副本。vector是一种特殊的beast,而不是真正的向量。back不返回引用,而是返回一个特殊的引用代理对象,该对象允许访问向量中的单个位。因为它是一个代理,所以它可以做一些普通引用无法做的额外事情,比如检查引用的位是否仍然存在。虽然我希望这只发生在调试版本中
您的问题是由于代理对象是可复制的,并且自动变量愉快地获取引用代理的副本,而编译器将剥离适当的引用,并且变量将是引用值的副本。std::vector