拉姆达 "call operator" 和 "parenthesized lambda"

lambda "call operator" and "parenthesized lambda"

我阅读了一个答案并偶然发现了下面的示例代码,这是 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 上查找什么。

  • f 这里是 lambda

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

    然而,添加 () 立即调用 lambda:

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

    它们等同于

    (f<T0>(), f<T1>(), .., f<Tn>())(f(arg0), f(arg1), .., f(argN)).