范围不是魔术。它有一个definition:
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 也不是魔法。它只是实际类型的占位符。
话虽如此,您可以使用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;
}
}
Translates to:
#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 是一个实现细节,但除此之外,发生了什么非常清楚。