C++:lambda表达式、IIFE 、连着用的 []{}() 到底是怎么一回事

        最近在学moveit2的时候发现官方教程c++程序里面有个没见过的写法,[]{}()连番上阵,究竟是怎么一回事呢?

        IIFE全称Immediately-Invoked Function Expression,与IILE:Immediately-Invoked Lambda Expression十分类似。可以把IIFE理解成功能更加强大的lambda表达式。

        使用IIFE的好处是,可以在定义变量时继续使用const关键字,即使定义这个变量需要经过十分复杂的逻辑判断。

const auto var = [&] { 
    return /*返回定义完了的那个变量,写一大堆代码也没问题*/; 
}(); //上面这段声明完了吧?声明完了咱就直接调用它

标准形式如下

[capture list](parameter list) -> return type {function body}

 三个括号:

[]:捕获说明符,捕获该lambda表达式所在函数中定义的局部变量。常用的有:

        [],空,啥也不捕获;

        [&],采用引用捕获,对于所有可捕获局部变量;

        [=],采用值捕获,对于所有可捕获局部变量;

        [&var1] or [var2],显式指定某个变量的捕获形式;

        也可以混用引用与值捕获;

{}:函数体,就跟写函数一样样的

():参数列表,就跟写函数一样样的

-> return type:

        假如函数体里只有一句return语句,可以省略;

        假如函数体里除了一句return语句还有其他语句,则需要使用->return type尾置返回类型,不然会报错;

接下来看个例子,就用moveit2的教程里面所用的例子:

auto const [success, plan] = [&move_group_interface]{
  moveit::planning_interface::MoveGroupInterface::Plan msg;
  auto const ok = static_cast<bool>(move_group_interface.plan(msg));
  return std::make_pair(ok, msg);
}();
[&move_group_interface]    // 前面已经定义过的对象,这里获取了其引用
// 一大串代码,最终是定义了ok和msg两个变量并返回了
{ 
  moveit::planning_interface::MoveGroupInterface::Plan msg;
  auto const ok = static_cast<bool>(move_group_interface.plan(msg));
  return std::make_pair(ok, msg);
}
();        // 最后直接调用它! success=ok, plan=msg

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值