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

pos*_*man 9 c++ idioms

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

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

Cam*_*ron 8

这是lambda函数的一个例子.

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

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

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

简而言之,这段代码:

m_time.Tick([&]() { ... });
Run Code Online (Sandbox Code Playgroud)

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