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

2021-03-30 16:28:52 +08:00
 auto8888
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;
};

就有点懵逼了

1745 次点击
所在节点    C++
4 条回复
auto8888
2021-03-30 17:11:35 +08:00
刚试了一下,貌似用引用捕获也不能修改外部变量???

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

直接看 cppreference 吧。

lambda 接收的是值,当然不会改外部变量咯
mogg
2021-03-30 17:55:07 +08:00
不太懂,楼主想问什么?
这里有一个作用域的概念,闭包里的 fun1,p 其实是 this.fun1,this.p
测试了一下( detach 改成 join ),没什么问题啊……
测试代码 https://paste.ubuntu.com/p/HrsHf5zSXS/
auto8888
2021-03-31 09:30:52 +08:00
@mogg 我也试了一下,那这样的话闭包能改变俘获的值啊( this.p )

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/766568

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX