如何命名C++捕获变量?能否直接引用捕获数组第三个元素?
关于C++ Lambda捕获的两个问题解答
1. 如何为C++ Lambda表达式的捕获变量命名?
在C++14及以后的标准中,支持命名捕获(init captures)语法,你可以直接在Lambda的捕获列表里给捕获的变量(甚至是表达式的结果)起别名,不用提前在外部声明变量再捕获。
具体用法分两种:
- 值捕获命名:
[别名 = 表达式],把表达式的结果拷贝一份绑定到别名上 - 引用捕获命名:
[&别名 = 表达式],把表达式对应的内存地址以引用形式绑定到别名上
比如你想把数组第三个元素捕获并命名为value,直接用[&value = arr[2]]就能完成引用捕获的命名,非常方便。
2. 不使用额外变量,直接以引用方式捕获数组的第三个元素?
当然可以!借助C++14的命名捕获特性,完全不需要提前写int &value = arr[2];这行代码,直接在Lambda的捕获列表里完成引用绑定。
修改后的代码示例:
#include <functional> #include <iostream> #include <vector> int main(int argc, char *argv[]) { std::vector<int> arr = {3,1,4}; std::cout << &arr[2] << " (原始arr[2]的地址)" << std::endl; std::vector<std::function<void(void)>> vfunc; for (int i = 0; i < 3; i++) { int a = i * 2; // 直接在捕获列表中绑定arr[2]的引用并命名为value std::function<void()> fn = [=, &value = arr[2]](){ std::cout << &value << " (Lambda捕获的value地址)" << std::endl; }; vfunc.push_back(fn); } for (auto& f : vfunc) { f(); } return 0; }
代码说明:
[=, &value = arr[2]]里的=表示默认按值捕获其他变量(比如这里的a),&value = arr[2]则是把arr[2]的引用直接绑定到别名value上。- 运行这段代码会看到,Lambda里输出的
&value地址和一开始的&arr[2]完全一致,说明确实直接引用了数组的第三个元素,没有通过额外变量中转。
如果你的项目还在使用C11标准,那确实绕不开提前声明变量的步骤,但现在主流编译器都已经支持C14及以上标准,这个方法完全可行。
内容的提问来源于stack exchange,提问作者daparic
相关产品推荐
相关产品推荐

