我读了C++ Primer:
他们进一步给出了以下代码:
string s("Hello World!!!");
// convert s to uppercase
for (auto &c : s) // for every char in s (note: c is a reference)
c = toupper(c); // c is a reference, so the assignment changes the char
in s
cout << s << endl;
我也读过:
问题:每次将引用变量
c
绑定(bind)到字符串s的下一个字符时,此代码都不会导致重新绑定(bind)吗?for (auto &c : s)
c = toupper(c);
最佳答案
没有现有变量的重新绑定(bind),在每次迭代中,“旧” c消失,并且再次创建"new" c,并初始化为下一个字符。该for
循环等效于:
{
auto it = begin(s);
auto e = end(s);
// until C++17: auto it = begin(s), e = end(s);
for(; it!=e; ++it) {
auto &c = *it;
c=toupper((unsigned char)c);
}
}
您会看到,在每次迭代中,
c
都被重新创建和重新初始化。换句话说,在基于范围的
for
循环的圆括号内声明的变量将循环的主体作为其范围。