cpp - lamda

74 阅读1分钟

Lambda 表达式是 C++ 引入的一种便捷的定义匿名函数对象的方式。它允许我们在需要函数对象的地方定义短小的函数,而不需要单独写一个函数或者函数对象类。

语法

[capture-list] (parameters) specifiers -> return-type { body }

capture-list(捕获列表)

  • []:空捕获列表,不捕获任何变量
  • [=]:以值方式捕获所有变量
  • [&]:以引用方式捕获所有变量
  • [x, &y]:捕获特定变量,x 为值捕获,y 为引用捕获
  • [this]:捕获 this 指针
  • [*this]:捕获当前对象的副本(C++17)

parameters(参数列表)[可选]

  • 与普通函数的参数列表语法相同
  • 如果不需要参数,可以省略 ()

specifiers(说明符)[可选]

  • mutable:允许修改按值捕获的变量
  • constexpr:声明为常量表达式(C++17)
  • noexcept:指定是否抛出异常
  • consteval:指定为即时函数(C++20)

return-type(返回类型)[可选]

  • 使用 -> 符号指定
  • 如果 body 只包含一个 return 语句,可以省略返回类型
  • 如果 body 包含多个语句,且未指定返回类型,则由编译器推导

body(函数体)

  • 包含在花括号中的函数实现代码

编译后

int multiplier = 10;
auto multiply = [multiplier](int x) { return x * multiplier; };

上述代码编译完后的产物为

class multiply {
    private:
        int multiplier_; // 捕获的变量
    public:
        // 构造函数,初始化捕获的变量
        multiplyFun(int multiplier) : multiplier(multiplier_) {}

        // 重载函数调用运算符
        int operator()(int x) const {
            return x * multiplier_;
        }
};