推荐答案
在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访问类的成员变量和成员函数。
-- -------------------- ---- ------- ----- ------- - ------- ---- ------ - ---- ------ - -------- - ------------ - --- -- --------- - -------- --- ------ - -- --
捕获初始化表达式
捕获初始化表达式允许你在捕获列表中初始化变量。这在C++14及更高版本中可用。
int x = 10; auto lambda = [y = x + 1]() { return y; }; std::cout << lambda(); // 输出 11
通过理解这些捕获方式,你可以更灵活地使用lambda表达式来处理不同的编程场景。