2
#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

输出“在没有活动异常的情况下终止调用”,然后程序中止。

这应该有效,不是吗?

4

1 回答 1

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(and std::forward) 只是从左值右值引用的强制转换操作,但除非您使用它实际移动到其他对象,否则原始对象保持不变。然后在原始代码中,您将引用本地对象并退出函数,std::thread然后函数内部被销毁并调用terminate(根据合约std::thread,对于任何其他对象,它只会返回对已销毁对象的悬空引用)。

于 2012-04-21T00:56:18.430 回答