本质:
语法糖,编译器还是会转化为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;
}
}