在我正在阅读的一本C ++书中:
int v[] = {0,1,2,3,4,5,6,7,8,9};
for (auto& x : v)
当书中的下一行说:
“..无法在初始化后引用其他对象...”
x指所有v的对象,它是如何工作的?
答案 0 :(得分:19)
for ( range_declaration : range_expression ) loop_statement
相当于
{
auto && __range = range_expression ;
auto __begin = begin_expr ;
auto __end = end_expr ;
for ( ; __begin != __end; ++__begin) {
range_declaration = *__begin;
loop_statement
}
}
这里range_declaration
是你的auto& x
,它被初始化为在每次迭代时引用每个元素,而不是重新绑定相同的引用。
答案 1 :(得分:14)
x指所有v的对象
不是在同一时间。每次循环x
都是新的局部变量,它引用单个数组元素。
在伪代码¹中,它就像
for (int* it = std::begin(v); it != std::end(v); ++it)
{
int& x = *it; // new local variable
// ...
}
¹有关具体信息,请参阅此处http://en.cppreference.com/w/cpp/language/range-for