C++ 的thread不能改变引用参数的值吗

发布于 2022-09-06 09:36:42 字数 218 浏览 16 评论 0

下面的程序输出结果为0,不理解为什么会这样,不应该是1吗?

void fun(int &a)
{
    a =1 ;
}
int main()
{
    int a =0 ;
    std::thread t(fun,a) ;
    t.join () ;
    cout<<a<<endl ;
    return 0 ;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

饭团 2022-09-13 09:36:42

标准约定std::thread构造时向函数对象传递实际参数的拷贝(支持移动语义),而不是转发实际参数(你可以通过打印实际参数和形式参数的地址来检测这一行为)。即fun的形式参数是被a的拷贝初始化的,所以形式参数a并不是main函数内a的引用,在fun内赋值自然不会改变main函数内a的值。

如果你希望“以引用的方式传参”,常用解决方案之一是使用std::ref,即std::thread(fun, std::ref(a));

苍风燃霜 2022-09-13 09:36:42
int main()
{
    int a = 0;
    thread t([&]() {
        a = 1;
    });
    t.join();
    cout << a << endl;
    return 0;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文