为什么移动构造函数在将临时函数传递给线程函数时被调用两次?

时间:2018-05-16 05:11:53

标签: c++ multithreading std stdthread perfect-forwarding

在下面的代码中,我无法理解为什么移动构造函数的类被调用两次,因为我的线程函数正在通过rvalue引用获取参数,所以我希望当参数被移动到线程构造函数时,移动构造函数只会被调用一次。有人可以深入了解线程构造函数的工作方式以及它如何将参数传递给线程函数。

#include <iostream>
#include <thread>
#include <chrono>
class Test {
  public:
  Test() {}
  Test(Test&&)
  {
    std::cout<<"Move Constructor Called..."<<std::endl;
  }
};
void my_thread_func(Test&& obj)
{
  using namespace std::chrono_literals;
  std::cout<<"Inside thread function..."<<std::endl;
  std::this_thread::sleep_for(2s);
}
int main() {
  std::thread t(my_thread_func,Test());
  std::cout << "Hello World!\n";
  t.join();
  return 0;
}

这个问题并不关心线程构造函数参数是否按值传递,而是更关心为什么移动构造函数被调用两次?

1 个答案:

答案 0 :(得分:0)

标准允许额外的移动构造,但效率可能较低。错过优化的错误是https://gcc.gnu.org/PR69724,已在即将发布的GCC 10版本中修复。