拉姆达 "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;
}
两个问题,每个问题都有子问题:
- lambda 的末尾是表达式
(multi_inputs), ...
这等同于以下简化语法:
auto y = [&]() { }();
这里有两件事我不明白,最后的 ()
叫什么,它有什么作用?
我假设这是某种函数调用运算符,但如果脱离上下文,它看起来像是多余的。
- 条目 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))
.
我阅读了一个答案并偶然发现了下面的示例代码,这是 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;
}
两个问题,每个问题都有子问题:
- lambda 的末尾是表达式
(multi_inputs), ...
这等同于以下简化语法:
auto y = [&]() { }();
这里有两件事我不明白,最后的 ()
叫什么,它有什么作用?
我假设这是某种函数调用运算符,但如果脱离上下文,它看起来像是多余的。
- 条目 lambda 本身包含在括号中
()
这等同于以下简化语法:
(auto y = [&]() { }());
在这里我想了解同样的,这个语法叫什么,它在上下文中和上下文中做了什么? 我假设这也是某种“括号运算符”,但对此一无所知。
了解这些括号的作用是一回事,但了解这种语法的含义对于理解 ex 也很重要。了解在 cppreference 上查找什么。
f
这里是 lambdaauto 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))
.