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

f1f2 之间的区别在于f1 捕获了xy 的引用,而f2 捕获了仅x 的引用。另一方面,f3 在定义时捕获 x 的值(在本例中为 0)。由于f1f2 都捕获了对 x 的引用,因此在 x 递增后调用它们时,它们都将打印 1。但是,由于f3 在定义时捕获了 x 的值,所以f3 将打印 0。

【讨论】:

【参考方案3】:

这是一个 lambda 表达式。这是一个非常典型的表达。括号中的部分是 lambda 的捕获子句,表示它如何与封闭范围内的局部变量进行交互。括号中包含参数列表,就像函数一样,括号中是函数定义。

这是一篇不太深奥的好文章。 http://www.drdobbs.com/cpp/lambdas-in-c11/240168241

【讨论】:

【参考方案4】:

lambda 表达式定义了一个匿名函数,该函数可以从其定义范围内捕获事物。特别是,[&amp;] 表示它通过引用捕获所有自动变量,() 表示它不接受任何参数。 `... 中的内容是函数体。有关 lambda 的更多信息,请参阅 http://en.cppreference.com/w/cpp/language/lambda。

大概,Tick 期望它的参数是一个可调用对象; lambda 用于此目的并且易于定义。定义调用运算符的对象也可能在该上下文中工作。函数指针也是如此。

【讨论】:

lambda 不是函数。这是一个表达式

以上是关于c++ 中的代码 `[&]()` 是啥意思? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

c++中的各种符号是啥意思?

C++ 中的 :: 是啥意思? [复制]

Android aosp 中的 PACKED 关键字是啥意思?

stdio 是啥意思?

在 mfc 和 c++ 中调用方法时 :: 是啥意思? [复制]

C、C++ 和 C# 中的 void 是啥意思?