c++ - 自动引用类型

标签 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

当我将鼠标悬停在 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
    }
}

所以您可以看到,在您的情况下,ij 的类型是从 *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 to T; if X is a const iterator, reference is a reference to const T,

这里reference用在24.4.4/2 [iterator.iterators]中,表示*it的返回类型。


因此,对于您的情况,标准要求 i 的类型为 int 并且 j 的类型为 int&。这可能是 MSVC++ 的情况,而智能感知只是无法正确解析类型。


编辑:修复了取消引用迭代器时有关返回类型的答案。

关于c++ - 自动引用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24059532/

相关文章:

c++ - template<class = enable_if_t<...>> 做什么?

c++ - 带有 MoveConstructible 对象的 std::push_heap 和 std::pop_heap

c++ - VS2008 C++项目编译的外化参数

c++ - 列表初始化编译错误

c++ - 如何从 std::vector 添加删除 std::functions

c++ - std::lock_guard 和 #pragma omp critical 之间的区别

c++ - 将虚拟复制构造函数添加到 std::packaged_task

c++ - 遍历矩阵的方法

sql - 插入字节数组 INTO varbinary(max) 记录

c++ - ATL 简单对象向导 - "Object Xxx already exists"错误