首页  >  文章  >  后端开发  >  为什么通过引用 std::thread 传递类对象仍然会触发复制构造函数?

为什么通过引用 std::thread 传递类对象仍然会触发复制构造函数?

Barbara Streisand
Barbara Streisand原创
2024-11-17 15:54:01375浏览

Why Does Passing a Class Object by Reference to std::thread Still Trigger the Copy Constructor?

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

问题:

传递时类 Log 的对象通过引用传递到 std::thread 时,会发生编译器错误,尽管预期引用传递应绕过复制构造函数。相反,通过指针传递对象可以解决问题。

说明:

此行为的根本原因是 std::thread 需要通过以下方式传递其参数价值。通过引用传递,如 Log &logger 中所示,与传递指针具有相同的效果,即它仍然需要复制构造函数来生成要传递给线程的对象的副本。

解决方案:

要重新获得引用语义,请使用 std::reference_wrapper:

std::thread newThread(session, &sock, std::ref(logger));

注意:

  1. 确保引用对象(本例中为 logger)的生命周期超过线程的生命周期。
  2. 在提供的代码中,Log 的复制构造函数是私有的,防止创建额外的副本。

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn