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::threadterminatestd::thread

于 2012-04-21T00:56:18.430 に答える