代码`[&]()`在c ++中意味着什么?

时间:2015-07-18 18:22:54

标签: c++ idioms

我正在寻找DirectX App的Visual Studio模板。我遇到了m_time.Tick([&]() { ... });行,我无法弄清[&]()部分的含义。我甚至不确定这是否是一个愚蠢的问题,因为我对c ++缺乏经验。

我知道[]用于lambda表达式,但我不确定这是否有意义。也许是一些奇怪的代表成语?我甚至不知道。如果你能指出我在尝试学习c ++时可能会遇到的其他模糊成语列表的方向,我会非常感激。

4 个答案:

答案 0 :(得分:8)

这是lambda function

的示例

C ++充满了晦涩的角落,但正如奇怪的语法一样,lambda函数非常值得学习。声明lambda函数的基本语法是[]() { }。这是一个表达式,它导致一个实现定义类型的对象,可以被调用就像它是一个函数一样(因为,在编译器的某个地方,lambda表达式语法的实现,它 a function)。

这给出的第一个好处是函数可以与代码的其余部分一起声明,而不必分开声明(这对于非常短或特定用途的函数来说通常很不方便)。

lambda表达式中最强大的部分是它们能够从周围的上下文捕获变量:这是&在示例代码中的作用。使用[&]声明的lambda通过引用捕获所有变量(以及在方法中使用的隐式this指针)。 (还有[=]按值捕获,甚至是扩展语法,只能以特定方式捕获特定变量。)

简而言之,这段代码:

m_time.Tick([&]() { ... });

Tick对象上调用m_time方法,并向其传递一个lambda函数,该函数通过引用捕获周围的上下文。据推测,Tick方法在执行期间调用此lambda函数。在...中,可以使用声明lambda的作用域中可用的变量 - 这种捕获能力是lambdas最强大和最方便的特性。

答案 1 :(得分:2)

这是一个lambda表达式。这是一个非常典型的表达方式。括号中的部分是lambda的capture子句,表示它与封闭范围中的局部变量的交互方式。括号将包含参数列表,就像一个函数,然后在括号中是函数定义。

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

答案 2 :(得分:2)

来自C ++ Primer

  

[&]由引用捕获列表隐含。来自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 :(得分:1)

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

据推测,Tick期望其参数是可调用对象; lambda用于此目的并且易于定义。定义调用操作符的对象也可能在该上下文中工作。可能是函数指针。