如果我有以下两个循环:
std::vector<int> v;
for(auto i : v)
//do something with i
for(auto& j : v)
//do something with j
当我将鼠标悬停在 i
上时,智能感知将其显示为 int i
(如预期的那样)。但是,当我将鼠标悬停在 j
上时我没有收到 int&
正如我所期望的那样,而是
std::_Simple_types<std::_Wrap_alloc<std::_Vec_base_types<int, std::allocator<int> >::_Alloc>::value_type>::value_type &j
这个复杂的定义是什么?和int&
一样吗?如果不是,那是什么?如果是,为什么它只能推断出 int
对于 i
,但不是 int&
对于 j
?
最佳答案
6.5.4 [stmt.ranges]
中的标准状态:
For a range-based for statement of the form
for ( for-range-declaration : expression ) statement
let
range-init
be equivalent to the expression surrounded by parentheses( expression )
In each case, a range-based for statement is equivalent to
{ auto && __range = range-init; for ( auto __begin = begin-expr, __end = end-expr; __begin != __end; ++__begin ) { for-range-declaration = *__begin; statement } }
所以您可以看到,在您的情况下,i
和 j
的类型是从 *it
的类型推导出来的,其中 它
是一个 std::vector
迭代器。 std::vector
迭代器是实现定义的,但是 *it
的结果不是。
如注释中所示,std::vector
迭代器是前向迭代器,在 24.2.5/1 [forward.iterators]
之后:
A class or pointer type
X
satisfies the requirements of a forward iterator if
- ...
- if X is a mutable iterator,
reference
is a reference toT
; ifX
is a const iterator,reference
is a reference toconst T
,
这里reference
用在24.4.4/2 [iterator.iterators]
中,表示*it
的返回类型。
因此,对于您的情况,标准要求 i
的类型为 int
并且 j
的类型为 int&
。这可能是 MSVC++ 的情况,而智能感知只是无法正确解析类型。
编辑:修复了取消引用迭代器时有关返回类型的答案。
关于c++ - 自动引用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24059532/