【问题标题】:Nested lambda syntax and invocation?嵌套的 lambda 语法和调用?
【发布时间】:2019-10-06 12:25:06
【问题描述】:

我不知道如何命名标题,希望它是正确的......

我偶然发现了下面的 lambda 定义,但不明白语法,var = [=]return [=] 的含义是什么?

也是下面ConstexprLambda()函数中的第二个问题,为什么我们不能必须调用add(1, 2)而不是add(1, 2)()为什么需要额外的()而在调用identity(123)时代码没有使用额外的()?

问题被放入代码的 cmets 中。

auto identity = [](int n) constexpr
{
    return n;
};

constexpr auto add = [](int x, int y)
{
    auto L = [=] // what is = [=]?
    {
        return x;
    };
    auto R = [=]
    {
        return y;
    };
    return [=] // what return [=] means here?
    {
        return L() + R();
    };
};

void ConstexprLambda()
{
    static_assert(identity(123) == 123);
    static_assert(add(1, 2)() == 3); // why can't we just add(1,2) like above?
}

示例取自here

【问题讨论】:

    标签: c++ c++11 lambda


    【解决方案1】:

    类型

    让我们从类型开始

    auto identity = [](int n) constexpr
    {
        return n;
    };
    

    这里的identity 是一个包装器,用于存储lambda(int) 类型的callable。 你也可以使用 std::function :

    std::function<int(int)> identity;
    

    所以identity 接受int 并在您调用它时返回int

    另一方面,add 在被调用时接受两个ints 并返回一个可调用对象。

    额外的 () 运算符

    你需要调用add(1, 2),因为add的返回类型是可调用的,否则你不能做add(1, 2)() == 3比较因为类型不匹配。

    查看godbolt上的实时类型

    【讨论】:

    • 这是否意味着(在上面的 add 函数中)return [=]auto T = [=] { } 实际上是嵌套的 lambda(lambda 中的 lambda)?
    • @metablaster add 是一个返回另一个 lambda 的 lambda。 [=] 表示按值捕获。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-23
    • 1970-01-01
    • 2011-01-26
    • 2011-01-01
    • 1970-01-01
    • 2020-12-12
    • 2018-09-15
    相关资源
    最近更新 更多