21xrx.com
2024-12-23 00:29:44 Monday
登录
文章检索 我的文章 写文章
C++ Lambda捕获局部变量引用
2023-06-28 10:26:34 深夜i     --     --
C++ Lambda 捕获 局部变量 引用

Lambda表达式是C++11标准中新增的一个语言特性,它将一个可调用代码块封装成一个对象,可以作为函数参数传递、返回值返回,或者被赋值给一个变量。

Lambda表达式的语法形式为:[capture list](parameters) mutable exception -> return type {statements},其中capture list为捕获列表,用于指定Lambda表达式中需要捕获的变量;parameters为Lambda表达式的参数列表;mutable用于指定Lambda表达式是否可以修改它所捕获的变量;exception用于指定Lambda表达式可能抛出的异常类型;return type用于指定Lambda表达式的返回值类型;statements为Lambda表达式的函数体,其中可以使用捕获的变量和参数。

在C++中,Lambda表达式可以通过值、引用或移动语义来捕获变量。当以值的方式捕获变量时,Lambda表达式会在创建时复制该变量的值;当以引用的方式捕获变量时,Lambda表达式会共享该变量;当以移动语义的方式捕获变量时,Lambda表达式会获取该变量的所有权,并且原始变量的值将被转移。

除了使用值、引用和移动语义来捕获变量之外,Lambda表达式还可以使用局部变量的引用来捕获变量。这种方式可以避免使用值传递时产生的复制开销,同时还能够修改被捕获的变量。

例如,下面的代码演示了Lambda表达式如何捕获局部变量的引用:


#include <iostream>

#include <functional>

std::function<int()> getLambda()

{

  int count = 0;

  return [&count]() -> int {

    return ++count;

  };

}

int main()

{

  auto lambda = getLambda();

  std::cout << lambda() << std::endl; // 输出1

  std::cout << lambda() << std::endl; // 输出2

  std::cout << lambda() << std::endl; // 输出3

  return 0;

}

在上面的代码中,getLambda函数返回一个Lambda表达式,该Lambda表达式捕获了一个名为count的局部变量的引用,并返回它自增后的值。在main函数中,我们首先通过调用getLambda函数来获取该Lambda表达式的实例,然后连续调用3次该实例,每次调用时输出的值分别为1、2、3,这说明Lambda表达式已经成功地捕获了局部变量的引用,并且能够正确地修改其值。

需要注意的是,当Lambda表达式使用局部变量的引用进行捕获时,在局部变量的生命周期结束后,Lambda表达式将无法访问该变量,因为其引用已经失效。因此,Lambda表达式中捕获的引用变量应保证在Lambda表达式调用时仍然有效。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复