首页 > 后端开发 > C++ > 为什么通过引用 std::thread 传递对象会调用复制构造函数?

为什么通过引用 std::thread 传递对象会调用复制构造函数?

Linda Hamilton
发布: 2024-11-15 08:17:02
原创
404 人浏览过

Why Does Passing an Object by Reference to std::thread Invoke the Copy Constructor?

std::thread:通过引用传递调用复制构造函数

理解问题

将对象传递给 std::thread 时,参数通常是复制到线程中,而不是被引用。这种行为与通过引用传递应避免复制构造的期望相矛盾。这种混乱源于 C 中引用和指针的区别。

复制构造函数和按引用传递

在 C 中,按引用传递对象通常意味着传递其地址,这相当于传递一个指针。然而,std::thread 有一个特定的实现,要求按值复制其参数。

使用 std::reference_wrapper

要实现引用语义,请使用 std::reference_wrapper,如下所示:

std::thread newThread(session, &sock, std::ref(logger));
登录后复制

这样,记录器不会被复制,而是将其引用传递给线程。请注意,记录器必须比线程寿命更长。

移动语义

在这种情况下不建议使用 std::move(),因为 std::thread 需要复制参数。移动对象会将其内存的所有权转移给线程,这可能是不需要的。

如果您的代码之前使用 std::move() 但现在失败,则可能是您的编译器版本未完全实现 C 11。请考虑更新编译器以增强 C 11 支持。

以上是为什么通过引用 std::thread 传递对象会调用复制构造函数?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板