std::ostream などのオブジェクトへの参照をスレッドに渡そうとしたとき関数を実行すると、コンストラクターが削除されたためにコンパイルが失敗する可能性があります。この問題は、通常、スレッドが参照エイリアシングの問題を避けるために引数をコピーするために発生します。
コンパイル エラーを回避するには、std::ref (または定数参照の場合は std::cref) を利用することが不可欠です。 std::ref を使用すると、値セマンティクスを使用して参照をラップでき、ラッパーを安全にコピーできるようになります。
std::thread t(foo, std::ref(std::cout));
ここで、std::ref ラッパーは、std への参照を含むコピー可能なオブジェクトを提供します。 :クート。したがって、スレッドはそれを正常にコピーし、関数を正しく実行できます。
このコードは、参照されたオブジェクトが有効である限り機能することに注意してください。オブジェクトの存続期間がスレッドの実行期間を確実に超えることが重要です。これに従わないと、未定義の動作が発生する可能性があります。
以上がオブジェクト参照をスレッドに渡すとコンパイル エラーが発生するのはなぜですか? `std::ref` はどのように役立つのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。