接收迭代器begin函数的返回值为什么只能是复制

张开发
2026/4/13 0:06:49 15 分钟阅读

分享文章

接收迭代器begin函数的返回值为什么只能是复制
思考代码为什么编译报错 #include iostream #include vector #include algorithm vectorstring 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是扩大临时变量生命周期, 扩大临时变量的生命周期是毫无意义的. 也可能产生未定义行为 所以迭代器就复制吧, 而且复制开销很小 */

更多文章