lambda返回布尔

rel*_*xxx 18 c++ lambda visual-studio-2010

我想找到点,它具有较小的Y坐标(如果更多这样的点,找到具有最小X的那个).用lambda编写时:

    std::min_element(begin, end, [](PointAndAngle& p1, PointAndAngle& p2) {
        if (p1.first->y() < p2.first->y())
            return true;
        else if (p1.first->y() > p2.first->y())
            return false;
        else 
            return p1.first->x() < p2.first->x();
    }
Run Code Online (Sandbox Code Playgroud)

我正进入(状态:

error C3499: a lambda that has been specified to have a void return type cannot return a value
Run Code Online (Sandbox Code Playgroud)

有什么区别:

    // works
    std::min_element(begin, end, [](PointAndAngle& p1, PointAndAngle& p2) {
        return p1.first->y() < p2.first->y();
    }
Run Code Online (Sandbox Code Playgroud)

    // does not work
    std::min_element(begin, end, [](PointAndAngle& p1, PointAndAngle& p2) {
        if (p1.first->y() < p2.first->y())
            return true;
        else 
            return false;
    }
Run Code Online (Sandbox Code Playgroud)

Jon*_*Jon 14

可以隐式推断lambda的返回类型,但是你需要有一个return语句来实现这一点; 这就是为什么你的"工作"lambda工作(返回类型推断为bool).

sehe的解决方案显式声明了返回类型,因此它也可以正常工作.

更新:

C++ 11标准§5.1.2/ 4规定:

如果lambda表达式不包含trailing-return-type,则就好像trailing-return-type表示以下类型:

  • 如果compound-statement的形式 { return expression ; }是lvalue-to-rvalue转换(4.1),数组到指针转换(4.2)和函数到指针转换(4.3)之后返回表达式的类型;

  • 否则,void.

你不工作的lambda属于第二类.


seh*_*ehe 12

正如迈克指出的那样,如果lambda的主体是一个返回语句,则从中推断出返回类型(见5.1.2/4)(感谢Mike).

std::min_element(begin, end, [] (const PointAndAngle & p1, const PointAndAngle & p2)
  -> bool 
 {
    if (p1.first->y() < p2.first->y())
         return true;
    else 
        return false;
}
Run Code Online (Sandbox Code Playgroud)

注意-> bool.