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中文网其他相关文章!