Ответ 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 просто не может правильно разрешить тип.
Изменить: Исправлен ответ на возвращаемый тип при разыменовании итераторов.