1)lambda 表达式
3.在 make_printer 中填写lambda,使得 main 中调用 printer()能正确输出 42,并且不发生悬空引用或未定义行为。至少给出两种不同写法,并解释其差异(例如:值捕vsstd::shared_ptr 等)。#include <iostream>#include <functional>
std::function<void()>make printer(){
int x= 42:
autof=/*TODO: 在这里写一个lambda */
//要求:返回的lambda在的数返回后仍能正确打印42
retumn f
int main() {
auto printer = make printer(),
printer();// 期望输出:42
方法 1:值捕获(最简单、最推荐)
std::function<void()> make_printer() {
int x = 42;
auto f = [x]() {
std::cout << x << std::endl;
};
return f; // 返回后 x 在 f 内部被复制,不会悬空
}
lambda 使用 值捕获 [x],把 x复制到 lambda 内部的闭包对象中。
即使 make_printer 返回后,局部变量 x 被销毁,但 λ 内部保存的是它的副本,所以依然能打印 42。
方法 2:使用 shared_ptr 捕获(适用于复杂对象)
std::function<void()> make_printer() {
auto px = std::make_shared<int>(42);
auto f = [px]() {
std::cout << *px << std::endl;
};
return f; // 返回后 px 引用计数保持为 1,不会悬空
}
✔ 为什么安全?
-
std::make_shared<int>(42)创建堆对象 -
λ 捕获的是
shared_ptr的 副本 -
返回后堆上的 int 仍然存在,因为引用计数不会归零
-
最终调用 printer() 时依然可以打印 42
| 方式 | 内存位置 | 生命周期 | 性能 | 适用场景 |
|---|---|---|---|---|
值捕获 [x] | lambda 的内部对象 | f 的生命周期 | ✔最快 | 小对象,POD 类型 |
shared_ptr 捕获 [px] | 堆上 | 引用计数控制 | 较慢(有引用计数) | 大对象/需要共享数据 |
828

被折叠的 条评论
为什么被折叠?



