首页 > 后端开发 > C++ > 正文

为什么'std::thread”在通过引用传递参数时不绕过复制构造函数?

DDD
发布: 2024-11-27 12:04:09
原创
924 人浏览过

Why Does `std::thread` Not Bypass Copy Constructors When Passing Arguments by Reference?

std::thread 和复制构造函数:理解传递引用难题

std::thread,现代的一个组成部分C 的多线程功能在通过引用传递对象时出现了困境。这是由于语言处理引用的方式和 std::thread 处理其参数的方式之间存在根本差异。

通过引用传递对象时,我们希望绕过复制构造函数,因为引用充当原始对象的别名。然而,这个假设对于 std::thread 并不成立。原因如下。

std::thread 的参数处理

与我们的期望相反,std::thread 按值传递其参数。声明一个函数对象,接受与线程相同的参数,然后使用提供的参数进行调用。这意味着每个参数都会被复制到函数对象中,即使它作为引用传递也是如此。

私有复制构造函数和失败的编译

在提供的代码中, Log 类有意通过将其设为私有来禁用复制构造函数。当 std::thread 尝试将记录器复制到函数对象中时,它会触发编译错误,因为私有复制构造函数无法访问。

使用 std::reference_wrapper 解决问题

为了在将参数传递给 std::thread 时重新获得引用语义,我们可以使用 std::reference_wrapper。使用 std::reference_wrapper 包装引用可确保函数对象接收对原始对象的引用,从而避免值复制的陷阱。

使用 std::reference_wrapper 的代码

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

在这个更正的示例中,编译器能够正确创建 std::thread 对象,因为记录器现在包装在std::reference_wrapper,保留其引用状态。

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

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