在下面的代码中,我无法理解为什么类的移动构造函数被调用两次,因为我的线程函数通过右值引用获取参数,所以我希望当参数移动到线程构造函数时,移动构造函数只会被调用一次。有人可以给出关于线程构造函数如何工作以及如何将参数传递给线程函数的见解。
#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;
}
这个问题不关心线程构造函数参数是按值传递的,它更关心为什么移动构造函数被调用两次?
标准允许额外的移动构造,但可能效率较低。那个错过优化的错误是https://gcc.gnu.org/PR69724并已在即将发布的 GCC 10 版本中修复。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)