C++14泛型Lambda与返回类型推导
请说明C++14中对Lambda的增强,包括泛型Lambda(auto参数)、初始化捕获(Init Capture,也称广义捕获)、返回类型自动推导,以及这些特性简化泛型编程的方式。
回答
小字辈
C++14 Lambda增强:
1. 泛型Lambda:Lambda参数可用auto,编译器生成模板化operator()。
auto add = [](auto a, auto b) { return a + b; };
int i = add(1, 2); // OK
std::string s = add(std::string("a"), std::string("b")); // OK
等价于匿名仿函数模板。
2. 初始化捕获(Init Capture):在捕获列表中定义变量并进行初始化,支持移动语义。
auto p = std::make_unique<int>(42);
auto f = [p = std::move(p)]() { return *p; }; // 移动捕获
还支持更复杂的表达式:[x = 1 + 2](){}。
3. 返回类型自动推导:Lambda体含多个return语句时自动推导(需所有return类型一致),否则需显式指定-> decltype(...)。
应用举例:
std::vector<std::string> v;
std::sort(v.begin(), v.end(),
[](auto& a, auto& b) { return a.size() < b.size(); });
// 无需模板参数,适合多种字符串类型