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<File> &files
并返回std::shared_ptr<std::string>
,并将此函数分配给generateHash
。 auto
关键字告诉编译器派生generateHash
的类型(在这种情况下,它是一个简单的速记)。空括号 ([]
) 表示 lambda 不捕获用于在 lambda 中使用的局部变量。
【讨论】:
以上是关于C++ 中奇怪的括号符号,看起来有点像 for each 循环的主要内容,如果未能解决你的问题,请参考以下文章