Подтвердить что ты не робот

Тип автоматической ссылки

Если у меня есть следующие две петли:

std::vector<int> v;

for(auto i : v)
  //do something with i

for(auto& j : v)
  //do something with j

Когда я наводил курсор на 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

Что это за сложное определение? Это то же самое, что int&? Если нет, то что это? И если это так, почему он может вывести только int для i, но не int& для j?

4b9b3361

Ответ 1

Стандартные состояния в 6.5.4 [stmt.ranges]:

Для диапазона для выражения формы

for ( for-range-declaration : expression ) statement

let range-init эквивалентно выражению, окруженному Скобки

( expression )

В каждом случае оператор, основанный на диапазоне, эквивалентен

{
    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&. Вероятно, это относится к MSVС++, и intellisense просто не может правильно разрешить тип.


Изменить: Исправлен ответ на возвращаемый тип при разыменовании итераторов.

Ответ 2

IntelliSense дает вам представление о реализации std::vector. Это сложный способ сказать ссылку на std::vector<int>::value_type или, в данном случае, ссылку на int.

Ответ 3

Да, это int. Все это означает, что intellisense запутался и сдался.

Intellisense не идеален: вы даже можете получить его с красным squiggly компилятором кода.