将对象传递给 std::thread 时,参数通常是复制到线程中,而不是被引用。这种行为与通过引用传递应避免复制构造的期望相矛盾。这种混乱源于 C 中引用和指针的区别。
在 C 中,按引用传递对象通常意味着传递其地址,这相当于传递一个指针。然而,std::thread 有一个特定的实现,要求按值复制其参数。
要实现引用语义,请使用 std::reference_wrapper,如下所示:
std::thread newThread(session, &sock, std::ref(logger));
这样,记录器不会被复制,而是将其引用传递给线程。请注意,记录器必须比线程寿命更长。
在这种情况下不建议使用 std::move(),因为 std::thread 需要复制参数。移动对象会将其内存的所有权转移给线程,这可能是不需要的。
如果您的代码之前使用 std::move() 但现在失败,则可能是您的编译器版本未完全实现 C 11。请考虑更新编译器以增强 C 11 支持。
以上是为什么通过引用 std::thread 传递对象会调用复制构造函数?的详细内容。更多信息请关注PHP中文网其他相关文章!