【问题标题】:lambda "call operator" and "parenthesized lambda"lambda“呼叫运算符”和“带括号的 lambda”
【发布时间】:2021-10-22 14:55:25
【问题描述】:

我已经阅读了一个答案并偶然发现了下面的示例代码,这是 Elliott 对其他 SO 问题HERE的回答

我在试图理解两件事(以及如何调用此语法)时遇到问题:

#include <iostream>

template <typename ... T>
void Foo (T && ... multi_inputs)
{
    int i = 0;
    
    ([&] (auto & input)
    {
        // Do things in your "loop" lambda
    
        ++i;
        std::cout << "input " << i << " = " << input << std::endl;

    } (multi_inputs), ...);
}


int main()
{
    Foo(2, 3, 4u, (int64_t) 9, 'a', 2.3);
    
    return 0;
}

两个问题,每个问题都有子问题:

  1. 在 lambda 的末尾是表达式(multi_inputs), ...

这相当于下面的简化语法:

auto y = [&]() { }();

我不明白这里有两件事,最后的() 叫什么,它的作用是什么? 我认为这是某种函数调用运算符,但如果脱离上下文,它看起来像是多余的。

  1. 条目 lambda 本身包含在括号中 ()

这相当于下面的简化语法:

(auto y = [&]() { }());

在这里我想理解同样的,这个语法叫什么,它在这个上下文中和上下文之外做什么? 我认为这也是某种“括号运算符”,但对此一无所知。

知道这些括号的作用是一回事,但知道这个语法叫什么对于理解 ex 很重要。知道在 cppreference 上查找什么。

【问题讨论】:

  • 1:与往常一样,() 在任何可调用对象或函数名称调用所述对象或函数之后。
  • 注意,这里的 lambda 定义了一个模板化调用运算符,折叠表达式中的 lambda 调用为参数包的每个组件调用了一个实例。这里没有冗余。

标签: c++ lambda syntax


【解决方案1】:
  • f 在这里是一个 lambda

    auto f = []() { return 42; };
    int i = f(); // i = 42
    

    而添加 () 会立即调用 lambda:

    int i = []() { return 42; }(); // lambda called immediately
                                   // i = 42;
    
  • (f&lt;Ts&gt;(), ...)(f(args), ...)fold expressions(带逗号运算符)以扩展可变参数模板。

    它们等价于

    (f&lt;T0&gt;(), f&lt;T1&gt;(), .., f&lt;Tn&gt;())(f(arg0), f(arg1), .., f(argN))

【讨论】:

  • 解释清楚,切中要害,谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-03-18
  • 1970-01-01
  • 2014-11-30
  • 2015-04-18
  • 2021-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多