この例では「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クラスはコピーコンストラクタのパラメータの左側の値として定義されていませんが、コピーコンストラクタとして、パラメータの正しい値を持っています。
ヘッダファイルのスレッドクラスへのポイントは本当にケースです。
ゼロからファイル、我々は結論を引き出すことができます:スレッドオブジェクトは、(コピー)をコピーすることはできません、とだけ(移動)を移動することができます。