std::thread およびコピー コンストラクター: 参照渡しの難題を理解する
std::thread、モダンなコンポーネントの不可欠な部分C のマルチスレッド機能では、オブジェクトを参照渡しするときにジレンマが生じます。これは、言語が参照を処理する方法と std::thread がその引数を処理する方法の根本的な違いによるものです。
オブジェクトを参照によって渡す場合、参照は次のように動作するため、コピー コンストラクターがバイパスされることが期待されます。元のオブジェクトのエイリアス。ただし、この仮定は std::thread には当てはまりません。その理由は次のとおりです。
std::thread の引数の処理
予想に反して、std::thread は引数を値で渡します。関数オブジェクトは宣言され、スレッドと同じパラメータを受け入れ、指定された引数を使用して呼び出されます。これは、参照として渡された場合でも、各引数が関数オブジェクトにコピーされることを意味します。
プライベート コピー コンストラクターとコンパイルの失敗
提供されたコードでは、 Log クラスはコピー コンストラクターをプライベートにすることで意図的に無効にします。 std::thread がロガーを関数オブジェクトにコピーしようとすると、プライベート コピー コンストラクターにアクセスできないため、コンパイル エラーが発生します。
std::reference_wrapper に関する問題の解決
引数を std::thread に渡すときに参照セマンティクスを取り戻すには、以下を使用できます。 std::reference_wrapper。 std::reference_wrapper で参照をラップすると、関数オブジェクトが元のオブジェクトへの参照を確実に受け取り、値のコピーの落とし穴を回避できます。
std::reference_wrapper を使用したコード
std::thread newThread(session, &sock, std::ref(logger));
この修正された例では、コンパイラは std::thread オブジェクトをロガーは std::reference_wrapper でラップされ、参照ステータスが維持されます。
以上が引数を参照渡しするときに `std::thread` がコピー コンストラクターをバイパスしないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。