gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 16:40:14 25 4
gpt4 key购买 nike

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

#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 版本进行修复。

关于c++ - 为什么在将临时变量传递给线程函数时移动构造函数会被调用两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50362849/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com