スレッドの点でC ++コピーコンストラクタ

この例では「C ++並列プログラミング実際の戦闘」の原因から来ています

書式#include <スレッド> 
の#include <iostreamの> 
の#include <stdexcept提供> クラスScropeThread 
{ パブリック
    ScropeThread(STD ::スレッドt):m_pThead(STD ::移動(T))
    { 場合(!m_pThead.joinable())
        { スローのstd :: logic_error(" ノースレッドを" ); 
        } 
    }ScropeThread()
    { 
        m_pThead.join()。
    } 
    ScropeThread(CONST ScropeThread&)= 削除します
    ScropeThread演算子 =(



        
            
    constの ScropeThread&)= 削除

プライベート
    STD :: m_pTheadスレッド。
}。

ボイド楽しい(ボイド){}
 int型のmain()
{ 
    ScropeThread(STD ::スレッド(FUN))。

    リターン 0 ; 
}

 

私は、このサブサブの主な機能になるだろう「という考えを持っていました」:

int型のmain()
{ 
    のstd ::スレッドT1(楽しいです)。
    ScropeThread ST(T1)。

    リターン 0 ; 
}

コンパイラは私にエラーを与えることを躊躇しませんでした。

一つは、T1は一時スレッドオブジェクトの定義のコンストラクタ引数scropethreadとして渡され、その後、パラメータリストscropethreadを通過され、スレッドオブジェクトT1を定義することです。

両方の方法は、パラメータにコピーされ、コピーコンストラクタ引数の使用が必要ということ、すなわち、両方の方法は、コピーコンストラクタスレッドクラスを使用します

与えられた理由は、採用した単語のスレッドクラスはコピーコンストラクタを定義しないということです。私はバッフル付きです。

約2時間のトス。突然の魂を祝福、cがで考える++ 正しい値の概念。ヨーヨー右、コンストラクタscropethreadへの引数は、私はパラメータのリストを作成した最初の道の一時  のstd ::スレッド(fun)は、これは右辺値

そして、私は、この定義の外にいる時:STD ::スレッドT1(楽しい) ; t1がある左の値

エラーの本当の原因は次のとおりです。Threadクラスはコピーコンストラクタのパラメータの左側の値として定義されていませんが、コピーコンストラクタとして、パラメータの正しい値を持っています。

ヘッダファイルのスレッドクラスへのポイントは本当にケースです。

ゼロからファイル、我々は結論を引き出すことができます:スレッドオブジェクトは、(コピー)をコピーすることはできません、とだけ(移動)を移動することができます

おすすめ

転載: www.cnblogs.com/XiaoXiaoShuai-/p/11334374.html