自动引用的类型
Type of auto reference
如果我有以下两个循环:
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&
一样吗?如果不是,那是什么?如果是的话,为什么它只能为i
推导出int
,而不能为j
推导出int&
呢?
6.5.4 [stmt.ranges]
中的标准状态:
对于形式为
的基于范围的For语句for ( for-range-declaration : expression ) statement
让
range-init
等价于由括号( expression )
在每种情况下,基于范围的for语句都相当于
{ 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
的引用;如果X
是const迭代器,则reference
是对const T
的引用,
这里reference
在24.4.4/2 [iterator.iterators]
中使用,表示*it
的返回类型。
因此,对于您的情况,标准要求i
的类型为int
, j
的类型为int&
。这可能是msvc++的情况,智能感知只是不能正确地解析类型。
Edit:修复了当解引用迭代器时关于返回类型的答案
IntelliSense让您了解std::vector
的实现。这是对std::vector<int>::value_type
或int
的引用的一种复杂的表达方式。
是的,是int
。这一切都意味着智慧感困惑了,放弃了。
智能感知并不完美:你甚至可以让它在编译代码时变成红色的弯弯曲曲
相关文章:
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 将成员函数的返回类型引用到C++中的自定义类
- 非类型引用参数可以在运行时修改,这是否意味着模板可以在运行时实例化?
- C++:类类型引用运算符=用法
- 将 const 类型引用对象注册为类成员对象C++
- 错误:绑定到类型引用会丢弃限定符
- 如果作为基类型引用传递,派生类型会解构吗
- 未分配返回未定义对象类型引用的 C++ 函数的返回值时会发生什么情况
- 类型引用的初始化无效
- C++ 从函数返回多个类型引用并将它们强制转换为我们需要的类型
- 函数常量返回类型:类型引用的初始化无效
- 将类型的嵌套类型引用为类模板的参数的问题
- 与返回类型(引用、常量引用)混淆
- 调用具有const键类型引用的std::指针集的count方法
- 返回运算符类型=-引用或值
- 非类型引用形参/实参
- c++中定义不同类型引用的区别
- 为什么返回类型引用输出流
- 非类型(引用)模板参数和链接
- 类型引用的初始化无效