代码"[&]()"在 c++ 中是什么意思?
What does the code `[&]()` mean in c++?
我正在为DirectX应用程序寻找Visual Studio模板。我遇到了m_time.Tick([&]() { ... });
,我不知道[&]()
部分是什么意思。我甚至不确定这是不是一个愚蠢的问题,因为我对c++相当缺乏经验。
我知道[]
用于lambda表达式,但我不确定这是否有意义。也许是一些奇怪的委托用语?我都不知道。
这是一个lambda函数的例子。
c++充满了晦涩的角落,但由于语法奇怪,lambda函数非常值得学习。声明lambda函数的基本语法是[]() { }
。这是一个表达式,其结果是一个实现定义类型的对象,可以像调用函数一样调用它(因为,在lambda表达式语法的编译器实现中,它是一个函数)。
这样做的第一个好处是,函数可以与其他代码内嵌声明,而不必分开声明(这对于非常短的或特定用途的函数通常是不方便的)。
然而,lambda表达式最强大的部分是它们能够从周围的上下文中捕获变量:这就是示例代码中的&
所做的。用[&]
声明的lambda通过引用捕获所有变量(如果在方法中使用,则捕获隐式this
指针)。(也有[=]
按值捕获,甚至扩展语法以特定方式捕获特定变量。)
简而言之,这段代码:
m_time.Tick([&]() { ... });
调用m_time
对象上的Tick
方法,并传递给它一个lambda函数,该函数通过引用捕获周围的上下文。大概,Tick
方法会在执行期间调用这个lambda函数。在...
中,可以使用声明lambda的作用域中可用的变量——这种捕获能力是lambda最强大、最方便的特性。
选自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
f1
和f2
的区别在于,f1
捕获了x
和y
的引用,而f2
只捕获了x
的引用。另一方面,f3
在定义时捕获x
的值(在本例中为0)。由于f1
和f2
都捕获了对x的引用,因此在x增加后调用它们时都将打印1。但是,由于f3
在定义时捕获了x的值,因此f3
将打印0。
这是lambda表达式。这是一个非常典型的表达。括号中的部分是lambda的捕获子句,表示它如何与封闭作用域中的局部变量交互。圆括号将包含形参列表,就像函数一样,然后在方括号中是函数定义。
这是一篇不太深奥的好文章。http://www.drdobbs.com/cpp/lambdas-in-c11/240168241
lambda表达式定义了一个匿名函数,该函数可以从其定义的范围内捕获内容。特别是,[&]
意味着它通过引用捕获所有自动变量,而()
意味着它不接受任何参数。{…}是函数体。有关lambdas的更多信息,请参阅http://en.cppreference.com/w/cpp/language/lambda。
假定Tick
期望它的形参是一个可调用对象;lambda可用于此目的,并且易于定义。定义调用操作符的对象也可能在该上下文中工作。函数指针也可以。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- C++中名称篡改的目的是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 派生类销毁的最佳实践是什么
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 通过JNI传递数据数组的最快方法是什么
- "using namespace std;"在C++的作用是什么?
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 文件系统:复制功能的速度秘诀是什么
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 是什么原因导致它无法编译?它是声明签名还是在函数本身的实现中
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么