本质:
语法糖,编译器还是会转化为for循环的调用形式
转换形式的衍化:
C++11 / C++17 / C++20
// C++17之前{auto && __range = 范围表达式 ;for (auto __begin = 首表达式, __end = 尾表达式 ; __begin != __end; ++__begin) {范围变量声明 = *__begin;循环语句}}
// C++17起 C++20之前{auto && __range = 范围表达式 ;auto __begin = 首表达式 ;auto __end = 尾表达式 ;for ( ; __begin != __end; ++__begin) {范围变量声明 = *__begin;循环语句}}
// C++20起{初始化语句auto && __range = 范围表达式 ;auto __begin = 首表达式 ;auto __end = 尾表达式 ;for ( ; __begin != __end; ++__begin) {范围变量声明 = *__begin;循环语句}}
从这一系列的衍化,可以看出来是一个不断修复bug的过程,不断完善的过程
C++ 17 —> C++ 20 增加了初始化语句:
#include <iostream>#include <vector>int main(){for (auto n = v.size(); auto i : v) // 初始化语句(C++20)std::cout << --n + i << ' ';std::cout << '\n';}
使用常量左值引用读元素 :
#include <iostream>#include <vector>int main(){std::vector <int> arr = {1,2,3,4,5};for(const int& i : arr){std::cout << i << std::endl;}}
使用 万能引用( universal reference )修改元素 :
#include <iostream>#include <vector>int main(){std::vector <int> arr = {1,2,3,4,5};for(auto&& i : arr){i = i + 1;}}
