lambda返回布尔

时间:2011-10-25 12:13:12

标签: c++ visual-studio-2010 lambda

我想找到具有较小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();
    }

我得到了:

error C3499: a lambda that has been specified to have a void return type cannot return a value

有什么区别:

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

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

2 个答案:

答案 0 :(得分:13)

可以隐式推断lambdas的返回类型,但是你需要有一个return语句来实现这一点;这就是你的“工作”lambda工作的原因(返回类型推断为bool)。

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

<强>更新

C ++ 11标准,§5.1.2/ 4声明:

  

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

     
      
  • 如果复合语句是表格   { return expression ; }之后返回表达式的类型   左值到右值的转换(4.1),数组到指针的转换   (4.2),和函数到指针的转换(4.3);

  •   
  • 否则,void

  •   

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

答案 1 :(得分:12)

正如Mike所说,如果lambda的主体是单个return语句,那么返回类型就是从中推断出来的(见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;
}

注意-> bool