lambda 返回布尔值

发布于 2024-12-11 19:13:27 字数 1000 浏览 0 评论 0原文

我想找到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;
    }

I want to find point, which has the less Y coordinate (if more of such points, find the one with smallest X).
When writing it with 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();
    }

I am getting:

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

what is the difference between:

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

and

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

吃不饱 2024-12-18 19:13:27

正如 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;
}

注意->布尔

As Mike noted, if the lambda's body is a single return statement, then the return type is inferred from that (see 5.1.2/4) (thanks 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;
}

Note -> bool.

本王不退位尔等都是臣 2024-12-18 19:13:27

lambda 的返回类型可以隐式推断,但您需要使用单个 return 语句来实现此目的;这就是为什么你的“工作”lambda 可以工作(返回类型推断为 bool )。

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

更新:

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

如果 lambda 表达式不包含尾随返回类型,则它是
就好像 Trailing-return-type 表示以下类型:

  • 如果复合语句的形式为
    <代码>{ 返回表达式 ; } 之后返回的表达式的类型
    左值到右值转换 (4.1)、数组到指针转换
    (4.2)和函数到指针的转换(4.3);

  • 否则,无效

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

The return type of lambdas can be implicitly inferred, but you need to have a single return statement to achieve this; that's why your "working" lambda works (return type inferred to be bool).

sehe's solution explicitly declares the return type, so it works fine as well.

Update:

The C++11 standard, §5.1.2/4 states:

If a lambda-expression does not include a trailing-return-type, it is
as if the trailing-return-type denotes the following type:

  • If the compound-statement is of the form
    { return expression ; } the type of the returned expression after
    lvalue-to-rvalue conversion (4.1), array-to-pointer conversion
    (4.2), and function-to-pointer conversion (4.3);

  • otherwise, void.

Your not-working lambda falls into the second category.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文