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
变量愉快地获取了引用代理的副本,而正确的引用将被编译器剥离并且变量将是引用值的副本。
在使用自动说明符创建使用 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
变量愉快地获取了引用代理的副本,而正确的引用将被编译器剥离并且变量将是引用值的副本。