Lambda表达式可在if语句中返回布尔值

aik*_*khs 4 c++ lambda c++14

只是为了说明这一点,我想返回truefalse使用if()语句内的lambda表达式。我看到了一个与我的问题类似的问题:LINK,但找不到答案。

所以这是我的示例代码:

if([&rel_pose](Eigen::VectorXd pose)
    {
        return (sqrt(pose(0) * pose(0) + pose(1) * pose(1)) < 2) ? true : false;
    }) // do smth
Run Code Online (Sandbox Code Playgroud)

当我尝试编译时,出现以下错误:

 error: could not convert ‘<lambda closure object>graphslam::GraphSLAM::main_pose_callback(const ConstPtr&)::<lambda(Eigen::VectorXd)>{rel_pose}’ from ‘graphslam::GraphSLAM::main_pose_callback(const ConstPtr&)::<lambda(Eigen::VectorXd)>’ to ‘bool’
  })
Run Code Online (Sandbox Code Playgroud)

好的,阅读错误我以为我没有调用函数,因为编译器不会将表达式视为bool。所以我尝试使用此代码:

if(([&rel_pose](Eigen::VectorXd pose)
    {
        return (sqrt(pose(0) * pose(0) + pose(1) * pose(1)) < 2) ? true : false;
    };)) // do smth
Run Code Online (Sandbox Code Playgroud)

错误:

expected ‘)’ before ‘;’ token
  };)) return;
Run Code Online (Sandbox Code Playgroud)

这看起来似乎是一个明显的错误,但是对我来说,我可能不正确地理解语法,并想问发生了什么。

编辑:请注意,我已经简化了代码,因此您可以轻松地复制错误。我知道在这种特殊情况下,lambda表达式没有任何意义。

Sta*_*nny 7

你忘了给你的lambda打电话。现在,您要说的if(function_pointer)是编译器无法将其转换为布尔表达式。


if因此,带有布尔型lambda的简单子句的编写方式如下:

if ([]() {
    return true;
}()) {
    //do sth
}
Run Code Online (Sandbox Code Playgroud)

通过在捕获变量的同时将其作为参数也可能会导致错误。您必须决定,因此:

if([](Eigen::VectorXd pose)
    {
        return (sqrt(pose(0) * pose(0) + pose(1) * pose(1)) < 2) ? true : false;
    }(rel_pose)){
    //do sth
}
Run Code Online (Sandbox Code Playgroud)

要么

if([&rel_pose]()
    {
        return (sqrt(rel_pose(0) * rel_pose(0) + rel_pose(1) * rel_pose(1)) < 2) ? true : false;
    }()){
    //do sth
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,是否需要lambda是有问题的,您可以摆脱lamdba,将布尔表达式留在if子句中。在谈论它时-无需在此处使用三元运算符。return sqrt(rel_pose(0) * rel_pose(0) + rel_pose(1) * rel_pose(1)) < 2;足够并且更具可读性。