C++11 核心特性实战
接上篇内容,我们继续深入 C++11 的常用新特性。这些改进不仅仅是语法的糖衣,更是为了解决实际开发中的痛点。
Lambda 表达式
为什么需要它
在 C++98/03 时代,如果想用算法库里的 sort 对自定义类型排序,通常需要定义一个仿函数类。比如比较商品价格,你得写个 ComparePriceLess 结构体重载 operator()。如果逻辑稍微变一下,还得再写一个 ComparePriceGreater。这种重复劳动不仅繁琐,还让代码臃肿不堪。
C++11 引入了 lambda 表达式,允许直接在代码中定义匿名函数对象,无需额外声明类或函数。
struct Goods {
std::string _name;
double _price;
int _evaluate;
Goods(const char* str, double price, int evaluate)
:_name(str), _price(price), _evaluate(evaluate) {}
};
// 传统方式需要定义 ComparePriceLess 等结构体
// 现在可以直接内联使用
std::vector<Goods> v = {{"苹果", 2.1, 5}, {"香蕉", 3, 4}};
sort(v.begin(), v.end(), [](const Goods& g1, const Goods& g2) -> bool {
return g1._price < g2._price;
});
可以看出,lambda 表达式让代码的可读性大幅提升,特别是当比较逻辑很短时。
语法与捕获列表
Lambda 的基本格式如下:
[capture-list] (parameters) mutable -> return-type { statement }
- capture-list(捕获列表):决定 lambda 能访问哪些外部变量。默认是空
[],表示不捕获任何变量。 - parameters:参数列表,与普通函数一致。若不需要参数可省略括号。
- mutable:默认 lambda 是
const的,加上mutable后内部成员变量可修改。


