类型交给编译器、遍历交给范围、逻辑交给捕获
auto 让类型交给编译器;范围 for 遍历容器;lambda 用一个匿名函数就地写逻辑。
auto n = 42; 推导出 intfor (auto x : v) 遍历[cap](args){ body }| 写法 | 含义 |
|---|---|
auto n = 42; | 类型由编译器从初值推导(这里是 int) |
for (auto x : v) | 范围 for:逐个取 v 的元素(复制);auto& 取引用 |
auto f = [x](int a){ return a+x; }; | lambda:捕获 x 按值,接收 a,返回 a+x |
[&] / [=] | 捕获列表:按引用 / 按值捕获所有外部变量 |
auto&(或 const auto&)遍历容器可避免拷贝;lambda 的 [] 不捕获任何外部变量,[x] 只捕获 x。C++14 起 lambda 参数可写 auto,像模板一样适配任意类型(呼应 30.1 函数模板)。
[x] 按值(拷贝快照)、[&x] 按引用(改原变量);按引用捕获要当心 lambda 生命周期超过变量会悬空。for (auto x : v) 是复制,改 x 不影响 v;要改原元素用 auto&。auto 推导,逻辑里有歧义会报错。auto 像"让系统自动补全类型",你只管给值;范围 for 像"扫一眼整个清单",不用手动数第几个;lambda 像"当场写张小纸条"即用即走,不用专门开个文件。
它们共同点是减少重复、降低出错面:把类型推导、遍历、临时逻辑都交给工具/编译器,代码更聚焦"想做什么"而非"怎么写"。这也是现代 C++ 倡导"表达意图,少写机械细节"的体现。
auto n = 42; 中 auto 的作用是?auto 由编译器根据初值推导类型,auto n=42; 的 n 是 int。for (auto x : v) 遍历 v,x 是?for (auto x : v) 的 x 是元素副本;要修改原元素须用 auto&。[x](int a){ return a+x; } 中 [x] 的作用是?[x] 是捕获列表:按值把外部变量 x 拷进 lambda。要引用则写 [&x]。