自动引用的类型

Type of auto reference

本文关键字:类型 引用      更新时间:2023-10-16

如果我有以下两个循环:

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
    }
}

所以你可以看到,在你的例子中,ij的类型是从*it的类型推导出来的,其中itstd::vector迭代器。std::vector迭代器是实现定义的,但*it的结果不是。


如注释所示,std::vector迭代器是前向迭代器,24.2.5/1 [forward.iterators]之后:

类型为X的类或指针满足转发的要求迭代器如果

  • 如果X是可变迭代器,则reference是对T的引用;如果X是const迭代器,则reference是对const T的引用,

这里reference24.4.4/2 [iterator.iterators]中使用,表示*it的返回类型。


因此,对于您的情况,标准要求i的类型为int, j的类型为int&。这可能是msvc++的情况,智能感知只是不能正确地解析类型。


Edit:修复了当解引用迭代器时关于返回类型的答案

IntelliSense让您了解std::vector的实现。这是对std::vector<int>::value_typeint的引用的一种复杂的表达方式。

是的,是int。这一切都意味着智慧感困惑了,放弃了。

智能感知并不完美:你甚至可以让它在编译代码时变成红色的弯弯曲曲