c++中的代码`[&]()`是什么意思?

What does the code `[&]()` mean in c++?

我正在寻找 DirectX 应用程序的 Visual Studio 模板。我遇到了 m_time.Tick([&]() { ... }); 这一行,但我无法弄清楚 [&]() 部分是什么意思。我什至不确定这是否是一个愚蠢的问题,因为我对 C++ 非常缺乏经验。

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

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

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

这是一个 lambda function 的例子。

C++ 充满了晦涩难懂的角落,但语法古怪,lambda 函数非常值得学习。声明 lambda 函数的基本语法是 []() { }。这是一个表达式,它产生一个实现定义类型的对象,可以像调用一个函数一样调用它(因为,在编译器实现的 lambda 表达式语法的某处,它 一个函数)。

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

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

简而言之,这段代码:

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

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

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

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

来自 C++ 入门

[&] Implicit by reference capture list. Entities from the enclosing function used in the lambda body are used by reference

因此,实际上,可以将 [&]() {...} 表达式视为一个语句,表示您希望对包含范围内声明的所有变量的引用在 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。