V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
auto8888
V2EX  ›  C++

请教下 lambda 函数的捕获值列表

  •  
  •   auto8888 · 2021-03-30 16:28:52 +08:00 · 1764 次点击
    这是一个创建于 1361 天前的主题,其中的信息可能已经有所发展或是发生改变。
    class Testc
    {
    public:
        void fun1(int *&p)
        {
            p = new int();
            *p =2;
        }
        void fun2()
        {
            std::thread t([=] {(fun1)( p);});
            if(t.joinable())
                t.detach();
        }
        int *p;
    };
    

    fun1 的参数是引用传递,为什么 fun2 用[=]捕获也编译通过,特殊在于参数是类的成员。

    如果把 fun1 移到全局函数,为什么 fun2 用[this]捕获也编译通过

    void fun1(int *&p)
    {
        p = new int();
        *p =2;
    }
    class Testc
    {
    public:
        void fun2()
        {
            std::thread t([this] {(fun1)( p);});
            if(t.joinable())
                t.detach();
        }
        int *p;
    };
    

    就有点懵逼了

    第 1 条附言  ·  2021-03-31 09:57:59 +08:00
    懂了懂了,感谢各位大佬

    1.std::thread detach() 要主线程等一下(sleep)一下才能确保执行完成,单步调试的时候可能会没有执行完成,导致 this.p 的值没改变

    2.lambda 函数可以改变引用捕获的值[&],虽然这里使用的是值捕获[=],但是,会隐式捕获到 this 。

    即:**类内的 lambda 函数,[&]和[=]都能更改类的成员**
    4 条回复    2021-03-31 09:30:52 +08:00
    auto8888
        1
    auto8888  
    OP
       2021-03-30 17:11:35 +08:00
    刚试了一下,貌似用引用捕获也不能修改外部变量???

    我,裂开来
    morningtzh
        2
    morningtzh  
       2021-03-30 17:18:12 +08:00
    https://zh.cppreference.com/w/cpp/language/lambda

    直接看 cppreference 吧。

    lambda 接收的是值,当然不会改外部变量咯
    mogg
        3
    mogg  
       2021-03-30 17:55:07 +08:00
    不太懂,楼主想问什么?
    这里有一个作用域的概念,闭包里的 fun1,p 其实是 this.fun1,this.p
    测试了一下( detach 改成 join ),没什么问题啊……
    测试代码 https://paste.ubuntu.com/p/HrsHf5zSXS/
    auto8888
        4
    auto8888  
    OP
       2021-03-31 09:30:52 +08:00
    @mogg 我也试了一下,那这样的话闭包能改变俘获的值啊( this.p )
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2695 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 05:45 · PVG 13:45 · LAX 21:45 · JFK 00:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.