思考:代码为什么编译报错 #include <iostream> #include <vector> #include <algorithm> vector<string> v4 = {"null", "null", "null", "null", "null"}; fill_n(v4.begin(), 2, "hello"); for (auto it& = v4.begin(); it != v4.end(); it++) { cout << *it << " "; } cout << endl; /* 分析 for (auto it& = v4.begin(); it != v4.end(); it++) v4.begin()返回是临时对象, 语法上表示是右值, 这就不能用非const的左值引用接收了 如果要加const也会报警丢失了const限定符号而报错 */ 注意: C++ 社区普遍约定:迭代器变量按值保存。 /* 改成右值引用行不行? ???for (auto it&& = v4.begin(); it != v4.end(); it++) for 循环 : for (auto &&elem : v4) 使用 auto&& 是为了完美转发,保留元素的精确类型(可能是左值引用或右值引用), 避免不必要的拷贝。那是针对元素的设计. 而这里的 it 是迭代器本身,不是元素。 迭代器不需要转发语义,只需要一个可移动、可复制的局部变量。按值获取是最自然、最安全的方式。 分析2: v4.begin是临时对象, auto&& it是扩大临时变量生命周期, 扩大临时变量的生命周期是毫无意义的. 也可能产生未定义行为 所以迭代器就复制吧, 而且复制开销很小 */