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