Почему конструктор перемещения вызывается дважды при передаче временных функций в функцию потока? - PullRequest
0 голосов
/ 16 мая 2018

В приведенном ниже коде я не мог понять, почему конструктор перемещения класса вызывается дважды, учитывая, что моя функция потока принимает аргумент по ссылке на 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;
}

Этот вопрос не связан с тем, что аргументы конструктора потока передаются по значению, и он больше касается вопроса, почему конструктор перемещенияназывается дважды?

...