我读了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循环的圆括号内声明的变量将循环的主体作为其范围。

07-24 09:50
查看更多