【发布时间】: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;
}
两个问题,每个问题都有子问题:
- 在 lambda 的末尾是表达式
(multi_inputs), ...
这相当于下面的简化语法:
auto y = [&]() { }();
我不明白这里有两件事,最后的() 叫什么,它的作用是什么?
我认为这是某种函数调用运算符,但如果脱离上下文,它看起来像是多余的。
- 条目 lambda 本身包含在括号中
()
这相当于下面的简化语法:
(auto y = [&]() { }());
在这里我想理解同样的,这个语法叫什么,它在这个上下文中和上下文之外做什么? 我认为这也是某种“括号运算符”,但对此一无所知。
知道这些括号的作用是一回事,但知道这个语法叫什么对于理解 ex 很重要。知道在 cppreference 上查找什么。
【问题讨论】:
-
1:与往常一样,
()在任何可调用对象或函数名称调用所述对象或函数之后。 -
注意,这里的 lambda 定义了一个模板化调用运算符,折叠表达式中的 lambda 调用为参数包的每个组件调用了一个实例。这里没有冗余。