C++11 範圍 for(for (auto x : vec))默認按值拷貝,循環體內修改 x 不影響容器原元素。需改為引用類型(auto& x 或 auto&& x)才能寫回。
vector<int> v = {1,2,3};
for (auto x : v) { x *= 2; } // x 是副本,v 不變
// v 仍為 {1,2,3}
// 修改元素:左值引用
for (auto& x : v) { x *= 2; } // v 變為 {2,4,6}
// 僅讀取:const 引用(避免拷貝大對象)
for (const auto& x : v) { cout << x; }
// 通用引用(C++14 起,適配移動語義)
for (auto&& x : v) { /* 可讀可寫,支持右值範圍 */ }
for (auto x : v) → 自動展開為 for (auto it = begin(v); it != end(v); ++it) { auto x = *it; ... }
for (auto& x : v) → 展開為 { auto& x = *it; ... } // 綁定原元素
for (auto& s : vec) s.flag = true;for (auto&& s : vec) process(std::move(s));for (auto&& child : node.children) dfs(child);口訣:要改元素,加 &;只讀取,加 const &;不確定,用 &&。