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
f1
和 f2
的区别在于 f1
捕获了 x
和 y
的引用,而 f2
捕获了仅引用 x
。另一方面,f3
在定义时捕获 x
的值(在本例中为 0)。由于 f1
和 f2
都捕获对 x 的引用,因此在 x 递增后调用时它们都会打印 1 。但是,由于 f3
在定义时捕获了 x 的值,因此 f3
将打印 0。
我正在寻找 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
将打印 1f2
将打印 1f3
将打印 0
f1
和 f2
的区别在于 f1
捕获了 x
和 y
的引用,而 f2
捕获了仅引用 x
。另一方面,f3
在定义时捕获 x
的值(在本例中为 0)。由于 f1
和 f2
都捕获对 x 的引用,因此在 x 递增后调用时它们都会打印 1 。但是,由于 f3
在定义时捕获了 x 的值,因此 f3
将打印 0。