通八洲科技

c++中的lambda捕获列表详解_c++值捕获与引用捕获【C++11】

日期:2025-12-20 00:00 / 作者:尼克
捕获列表决定外部变量以值或引用方式进入lambda作用域:[x,y]为值捕获(独立副本),[&x,&y]为引用捕获(共享原变量),混合写法如[x,&y]支持灵活组合,[this]用于类内访问成员。

捕获列表的基本写法和作用

lambda表达式的捕获列表位于方括号 [] 中,用于说明函数体中要使用的外部变量如何“带进来”。它决定了这些变量是以副本(值捕获)还是以别名(引用捕获)的方式进入 lambda 作用域。没有正确理解捕获方式,容易引发悬空引用、未定义行为或意外的修改。

值捕获:复制一份,彼此独立

用变量名直接写在捕获列表中,如 [x, y],表示对 x 和 y 进行值捕获——编译器在 lambda 创建时拷贝它们的当前值。之后无论原变量怎么变,lambda 内部看到的始终是快照时刻的副本。

引用捕获:共享同一份数据

在变量名前加 &,如 [&x, &y],表示引用捕获。lambda 内部操作的就是原始变量本身,任何修改都会反映到外部作用域。

混合捕获与特殊写法

一个 lambda 可同时使用值捕获和引用捕获,但需注意顺序:引用捕获不能出现在值捕获之后(C++11 起已允许混合,但语义清晰更重要)。

基本上就这些。捕获的本质是控制变量的“可见性”和“生命周期归属”,选值还是引用,关键看你要不要同步变化、能不能保证引用有效、以及是否在意拷贝成本。