CodeWalk

C++14泛型Lambda与返回类型推导

作者:小字辈 · 2026-05-30 12:55

请说明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(); });
// 无需模板参数,适合多种字符串类型