Диапазон не волшебный c. Он имеет определение :
for ( init-statement(optional)range_declaration : range_expression ) loop_statement
Значения
{
init - statement
auto&& __range = range_expression;
auto __begin = begin_expr;
auto __end = end_expr;
for (; __begin != __end; ++__begin) {
range_declaration = *__begin;
loop_statement
}
}
auto
тоже не маги c. Это просто заполнитель для фактического типа.
Сказав это, вы можете использовать cppinsights.io , чтобы перевести некоторые ярлыки в современном C ++ в более традиционные концепции. Например. Это:
#include <utility>
#include <vector>
int main() {
std::vector<std::vector<std::pair<int, int>>> graf;
// fill graf
for (auto x : graf[0]) {
x.first += x.second;
}
}
Переводит на :
#include <utility>
#include <vector>
int main()
{
std::vector<std::vector<std::pair<int, int> > > graf = std::vector<std::vector<std::pair<int, int>, std::allocator<std::pair<int, int> > >, std::allocator<std::vector<std::pair<int, int>, std::allocator<std::pair<int, int> > > > >();
{
std::vector<std::pair<int, int>, std::allocator<std::pair<int, int> > > & __range1 = graf.operator[](0);
std::__wrap_iter<std::pair<int, int> *> __begin1 = __range1.begin();
std::__wrap_iter<std::pair<int, int> *> __end1 = __range1.end();
for(; std::operator!=(__begin1, __end1); __begin1.operator++())
{
std::pair<int, int> x = std::pair<int, int>(__begin1.operator*());
x.first += x.second;
}
}
}
std::__wrap_iter
- это деталь реализации, но кроме этого очень ясно, что происходит.