Bar*_*uch 19 c++ visual-studio c++11 visual-studio-2013
如果我有以下两个循环:
std::vector<int> v;
for(auto i : v)
//do something with i
for(auto& j : v)
//do something with j
Run Code Online (Sandbox Code Playgroud)
当我将鼠标悬停在上面时i
,intellisense会将其显示为int i
(如预期的那样).但是,当我将鼠标悬停在上面时,j
我并没有int&
像预期的那样得到,而是
std::_Simple_types<std::_Wrap_alloc<std::_Vec_base_types<int, std::allocator<int> >::_Alloc>::value_type>::value_type &j
Run Code Online (Sandbox Code Playgroud)
这个复杂的定义是什么?它是一样的int&
吗?如果没有,那是什么?如果是,为什么它只是推断int
为i
,但不int&
为j
?
Dan*_*vil 11
标准规定6.5.4 [stmt.ranges]
如下:
对于基于范围的表单声明
Run Code Online (Sandbox Code Playgroud)for ( for-range-declaration : expression ) statement
让我们
range-init
相当于括号括起来的表达式Run Code Online (Sandbox Code Playgroud)( expression )
在每种情况下,基于范围的for语句等同于
Run Code Online (Sandbox Code Playgroud){ auto && __range = range-init; for ( auto __begin = begin-expr, __end = end-expr; __begin != __end; ++__begin ) { for-range-declaration = *__begin; statement } }
所以,你可以看到你的情况的类型i
,并j
从类型推导*it
这里it
是一个std::vector
迭代器.std::vector
迭代器是实现定义的,但结果*it
不是.
如注释中所示,std::vector
迭代器是一个前向迭代器,之后24.2.5/1 [forward.iterators]
:
类或指针类型
X
满足前向迭代器的要求
- ...
- 如果X是一个可变迭代器,
reference
则引用T
; ifX
是一个const迭代器,reference
是一个引用const T
,
这里reference
用于24.4.4/2 [iterator.iterators]
表示返回类型*it
.
因此,对于你的情况下,标准要求的类型i
是int
和类型j
是int&
.这可能是MSVC++的情况,而intellisense无法正确解析该类型.
编辑:修复了取消引用迭代器时有关返回类型的答案.
IntelliSense可以让您了解实现的方法std::vector
.这是一种复杂的说法参考std::vector<int>::value_type
或在这种情况下参考的方式int
.
是的,确实如此int
.这意味着intellisense感到困惑并放弃了.
智能感知并不完美:你甚至可以把它变成红色波浪形的编译代码.
归档时间: |
|
查看次数: |
537 次 |
最近记录: |