C++ 中奇怪的括号符号,看起来有点像 for each 循环

Posted

技术标签:

【中文标题】C++ 中奇怪的括号符号,看起来有点像 for each 循环【英文标题】:Strange bracket-parentheses notation in C++, looking somewhat like a for each loop 【发布时间】:2014-02-26 10:32:01 【问题描述】:

这就是代码的样子:

auto generateHash = [](std::vector<File> &files) -> std::shared_ptr<std::string> 
    // Other code here

这是什么意思?每个循环都有一个吗?开头的括号有什么作用?括号有什么作用?箭头是什么意思?因为没有C++11编译器所以无法编译,在C++参考中也找不到。

【问题讨论】:

它是lambda。第一部分 ([]) 是捕获组,第二部分 (()) 是参数,第三部分 (->) 是返回类型,然后就是代码。 称为lambda表达式:***.com/questions/7627098/… 【参考方案1】:

这是什么意思?

这是一个 lambda - 一个函数对象。你可以像函数一样调用它,带有一个文件向量(通过可变引用传递,出于某种奇怪的原因),它是一个返回字符串(由共享指针管理,出于某种奇怪的原因)。

std::vector<File> files = get_some_files();
std::shared_ptr<std::string> hash = generateHash(files); // call the lambda

每个循环都有一个吗?

没有。看起来像

for (auto thing : sequence) /* code */

开头的括号有什么作用?

它们表示它是一个 lambda。它们可以包含捕获列表,您希望这些局部变量可用于 lambda 内的代码。

箭头是什么意思?

这是一个尾随返回类型。在 C++11 中,您可以根据需要将该语法与普通函数一起使用;但这是指定 lambda 的返回类型的唯一方法。

我在 C++ 参考中找不到它。

就在这里:http://en.cppreference.com/w/cpp/language/lambda

【讨论】:

这很有帮助,谢谢!有没有可能以另一种方式做到这一点?恐怕我无法将编译器更改为 C++11。 @DonAlonzo:如果不需要捕获任何内容,您可以将其替换为普通函数。如果是这样,那么您可能需要编写一个带有构造函数的函数类,该构造函数可以捕获所需的任何内容。您也必须摆脱 shared_ptr,因为这也是 C++11 - 但无论如何按值返回 string 会更有意义。【参考方案2】:

这是 lambda 函数,参见例如http://en.cppreference.com/w/cpp/language/lambda.

【讨论】:

【参考方案3】:

这是一个 C++11 的 lambda 函数,有关它们如何工作的教程,您可以查看 this,其他纯参考您可以查看 this。

在您的情况下,它定义了一个匿名函数,该函数接受std::vector&lt;File&gt; &amp;files 并返回std::shared_ptr&lt;std::string&gt;,并将此函数分配给generateHashauto 关键字告诉编译器派生generateHash 的类型(在这种情况下,它是一个简单的速记)。空括号 ([]) 表示 lambda 不捕获用于在 lambda 中使用的局部变量。

【讨论】:

以上是关于C++ 中奇怪的括号符号,看起来有点像 for each 循环的主要内容,如果未能解决你的问题,请参考以下文章

C++ 中奇怪的函数声明和 lambdas

你能给我一些 C++ 中奇怪的单行注释的例子吗?

C中奇怪的初始化

C ++中奇怪的运行时异常

C中奇怪的malloc行为

wav文件中奇怪的滴答声