c++ 中的代码 `[&]()` 是啥意思? [复制]
Posted
技术标签:
【中文标题】c++ 中的代码 `[&]()` 是啥意思? [复制]【英文标题】:What does the code `[&]()` mean in c++? [duplicate]c++ 中的代码 `[&]()` 是什么意思? [复制] 【发布时间】:2015-10-08 06:12:47 【问题描述】:我正在寻找 DirectX 应用程序的 Visual Studio 模板。我遇到了m_time.Tick([&]() ... );
这条线,但我无法弄清楚[&]()
部分的含义。我什至不确定这是否是一个愚蠢的问题,因为我对 C++ 非常缺乏经验。
我知道 []
用于 lambda 表达式,但我不确定这是否有意义。也许是一些奇怪的代表习语?我什至不知道。如果您能指出我在尝试学习 c++ 时可能遇到的其他晦涩成语列表的方向,我将不胜感激。
【问题讨论】:
这是lambda function的语法。 @Cameron:这个链接很完美。对于一个完整的答案来说,这是一个太明显的问题吗?我想投赞成票,因为你可能为我节省了几个小时来弄清楚如何在谷歌上搜索“[&()” Lambda 描述:***.com/questions/7627098/… 【参考方案1】:这是lambda function 的示例。
C++ 充满了晦涩难懂的角落,但随着奇怪的语法出现,lambda 函数非常值得学习。声明 lambda 函数的基本语法是 []()
。这是一个表达式,它产生一个实现定义类型的对象,可以像调用函数一样调用它(因为,在编译器的 lambda 表达式语法的实现中,它是一个函数)。
这样做的第一个好处是该函数可以与其余代码内联声明,而不必单独声明(这对于非常短或特定用途的函数通常不方便)。
不过,lambda 表达式最强大的部分是它们能够从周围的上下文中捕获变量:这就是 &
在您的示例代码中所做的。使用 [&]
声明的 lambda 通过引用捕获所有变量(以及隐式的 this
指针,如果在方法内使用)。 (还有 [=]
可以按值捕获,甚至还有扩展语法以特定方式仅捕获特定变量。)
简而言之,这段代码:
m_time.Tick([&]() ... );
在m_time
对象上调用Tick
方法,并向其传递一个通过引用捕获周围上下文的lambda 函数。据推测,Tick
方法会在其执行期间调用此 lambda 函数。在...
中,可以使用声明 lambda 的范围内可用的变量——这种捕获能力是 lambda 最强大和最方便的特性。
【讨论】:
【参考方案2】:来自 C++ 入门
[&] 隐式引用捕获列表。 lambda 主体中使用的封闭函数中的实体通过引用使用
因此,实际上,将[&]() ...
表达式视为表示您希望对包含范围内声明的所有变量的引用在 lambda 表达式中可用的语句。比如……
#include <iostream>
int main(int argc, char** argv)
int x = 0;
int y = 1;
auto f1 = [&] () std::cout << x << std::endl;
auto f2 = [&x] () std::cout << x << std::endl;
auto f3 = [x] () std::cout << x << std::endl;
++x;
f1();
f2();
f3();
f1
将打印 1
f2
将打印 1
f3
将打印 0
f1
和f2
之间的区别在于f1
捕获了x
和y
的引用,而f2
捕获了仅x
的引用。另一方面,f3
在定义时捕获 x
的值(在本例中为 0)。由于f1
和f2
都捕获了对 x 的引用,因此在 x 递增后调用它们时,它们都将打印 1。但是,由于f3
在定义时捕获了 x 的值,所以f3
将打印 0。
【讨论】:
【参考方案3】:这是一个 lambda 表达式。这是一个非常典型的表达。括号中的部分是 lambda 的捕获子句,表示它如何与封闭范围内的局部变量进行交互。括号中包含参数列表,就像函数一样,括号中是函数定义。
这是一篇不太深奥的好文章。 http://www.drdobbs.com/cpp/lambdas-in-c11/240168241
【讨论】:
【参考方案4】:lambda 表达式定义了一个匿名函数,该函数可以从其定义范围内捕获事物。特别是,[&]
表示它通过引用捕获所有自动变量,()
表示它不接受任何参数。 `... 中的内容是函数体。有关 lambda 的更多信息,请参阅 http://en.cppreference.com/w/cpp/language/lambda。
大概,Tick
期望它的参数是一个可调用对象; lambda 用于此目的并且易于定义。定义调用运算符的对象也可能在该上下文中工作。函数指针也是如此。
【讨论】:
lambda 不是函数。这是一个表达式。以上是关于c++ 中的代码 `[&]()` 是啥意思? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
Android aosp 中的 PACKED 关键字是啥意思?