【问题标题】: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:这个链接很完美。对于一个完整的答案来说,这是一个太明显的问题吗?我想投赞成票,因为你可能为我节省了几个小时来弄清楚如何在谷歌上搜索“[&}(){”

标签: c++ idioms


【解决方案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 不是函数。这是一个表达式
        猜你喜欢
        • 2013-05-15
        • 2017-08-21
        • 2023-03-19
        • 2013-10-06
        • 2019-09-12
        • 1970-01-01
        • 1970-01-01
        • 2018-04-19
        • 2020-07-09
        相关资源
        最近更新 更多