C++_面试题15_lambda表达式

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]堆上引用计数控制较慢(有引用计数)大对象/需要共享数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值