3

今天在阅读一些代码时,我偶然发现了这样的事情:

int v[5] = {1, 13, 17, 20, 16};
for_each(begin(v), end(v), [](int n){ cout << n << endl; });

我有点明白发生了什么。它使用 std::for_each 函数打印数组 v[] 的所有值。但是有什么关系[](int n){ cout << n << endl; }呢?

4

1 回答 1

12

您在这里看到的是在 C++ 中使用 lambda 函数(这是C++11的一个特性)。

什么是 lambda 函数?基本上,它是一个可以在源代码中内联编写的函数。通过这样做,您可以轻松地内联创建快速函数,而以前您需要编写一个单独的命名函数。

在你的情况下,这是发生了什么:

for_each(begin(v), end(v), [](int n){ cout << n << endl; });
                           ^^
                           ||

这是告诉编译器我们在这里创建的是一个 lambda 函数的标识符。

for_each(begin(v), end(v), [](int n){ cout << n << endl; });
                              ^^^^^
                              |||||

这是参数列表,在本例中是来自您的数组的整数v[]

for_each(begin(v), end(v), [](int n){ cout << n << endl; });
                                      ^^^^^
                                      |||||

从这里我们可以看到函数体。这就像如果您要创建一个常规函数,只是它与您的其余代码内联。


如前所述,lambda 函数是内联函数,因此您可能想知道返回类型在哪里。如果 lambda 不是很复杂,则它是可选的,因为编译器可以推断出什么是返回类型。在您的情况下,编译器知道您的函数不返回任何内容。例如,如果您希望它显式返回一个 int,您可以告诉编译器您希望函数返回什么,如下所示:

[] () -> int { return 2; };
于 2013-09-08T20:59:54.240 回答