最近在学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