推荐答案
在C++中,lambda表达式的捕获列表用于指定lambda函数体中可以访问的外部变量。捕获列表的语法如下:
[ capture-list ] ( parameters ) -> return-type { body }捕获列表可以有以下几种形式:
按值捕获:使用
=符号,表示按值捕获所有外部变量。int x = 10; auto lambda = [=]() { return x; };按引用捕获:使用
&符号,表示按引用捕获所有外部变量。int x = 10; auto lambda = [&]() { x = 20; };混合捕获:可以同时使用
=和&,并指定具体的变量。int x = 10, y = 20; auto lambda = [&x, y]() { x = y; };捕获this指针:在类的成员函数中使用lambda时,可以捕获
this指针。class MyClass { public: void func() { auto lambda = [this]() { this->member = 10; }; } private: int member; };捕获初始化表达式:C++14引入了捕获初始化表达式,允许在捕获列表中初始化变量。
int x = 10; auto lambda = [y = x + 1]() { return y; };
本题详细解读
按值捕获
按值捕获意味着lambda表达式会复制外部变量的值,并在lambda函数体中使用这些副本。这意味着在lambda函数体中对这些变量的修改不会影响外部变量。
int x = 10;
auto lambda = [=]() { return x; };
x = 20;
std::cout << lambda(); // 输出 10按引用捕获
按引用捕获意味着lambda表达式会直接引用外部变量,而不是复制它们。因此,在lambda函数体中对这些变量的修改会影响外部变量。
int x = 10;
auto lambda = [&]() { x = 20; };
lambda();
std::cout << x; // 输出 20混合捕获
混合捕获允许你同时按值和按引用捕获不同的变量。你可以根据需要选择性地捕获变量。
int x = 10, y = 20;
auto lambda = [&x, y]() { x = y; };
lambda();
std::cout << x; // 输出 20捕获this指针
在类的成员函数中使用lambda时,捕获this指针允许lambda访问类的成员变量和成员函数。
// www.javascriptcn.com code example
class MyClass {
public:
void func() {
auto lambda = [this]() { this->member = 10; };
lambda();
}
private:
int member = 0;
};捕获初始化表达式
捕获初始化表达式允许你在捕获列表中初始化变量。这在C++14及更高版本中可用。
int x = 10;
auto lambda = [y = x + 1]() { return y; };
std::cout << lambda(); // 输出 11通过理解这些捕获方式,你可以更灵活地使用lambda表达式来处理不同的编程场景。