#include <iostream>
#include <thread>
using namespace std;
thread&& launch(){
thread launchee([](){
this_thread::sleep_for(chrono::milliseconds(280));
cout<<"HA!"<<endl;
});
return move(launchee);
}
int main(int argc, char **argv){
thread mine(launch());
mine.join();
}
使用g++-4.6 -std=c++0x 1.cpp -o e1 -pthread
输出“在没有活动异常的情况下调用终止”,然后程序中止。
这应该有用,不应该吗??
答案 0 :(得分:9)
您希望按值返回一个帖子,而不是 rvalue-reference :
std::thread launch() {
std::thread launchee([](){
std::this_thread::sleep_for(std::chrono::milliseconds(280));
std::cout<<"HA!"<<std::endl;
});
return launchee;
}
原因是std::move
(和std::forward
)只是从左值到 rvalue-reference 的强制转换操作,但除非您使用它实际移动到其他对象,原始对象保持不变。在原始代码中,您接着引用本地对象并退出该函数,然后销毁函数内的std::thread
并调用terminate
(根据std::thread
的合同,对于任何其他对象,它只会返回对被破坏对象的悬空引用。)