C++ auto循环

struct Test {
  int id_;
  std::list<int> list_;
};

int main() {
  std::list<Test> _list{{1, {1, 2, 3}}, {2, {4, 5, 6}}};
  for (auto &iter : _list) {
      
    //==--------1.拷贝内容,修改无效--------==
    for (auto it : iter.list_) {
      it = 9;
    }
    //结果:_list{{1, {1, 2, 3}}, {2, {4, 5, 6}}}
    //==----------------------------------==
      
      
    //==--------2.引用内容,修改有效--------==
    for (auto &it : iter.list_) {
      it = 9;
    }
    //结果:_list{{1, {9, 9, 9}}, {2, {9, 9, 9}}}
    //==----------------------------------==
      
      
    //==--------3.const引用,不可修改--------==
    for (const auto &it : iter.list_) {
      it = 9; //报错
    }
    //==----------------------------------==
  }
}

上面例子中,如果最外层的auto不可以修改,那么就算内部的auto修改了也没用。

for (auto &c : s){
    c = toupper(c); 
}  
//等价于
for (auto it = s.begin(); it != s.end(); ++it)
{
    auto &c = *it;	// *it取迭代其的值,auto &c表示引用
    c = toupper(c);
}