オブジェクトを std::thread に渡すとき、引数は通常参照されるのではなく、スレッドにコピーされます。この動作は、参照による受け渡しがコピー構築を回避する必要があるという期待に反します。この混乱は、C における参照とポインタの区別から生じています。
C では、オブジェクトを参照によって渡すことは、通常、そのアドレスを渡すことを意味し、これは渡すことと同等です。ポインタ。ただし、std::thread には、引数を値によってコピーする必要がある特定の実装があります。
参照セマンティクスを実現するには、次のように std::reference_wrapper を使用します。
std::thread newThread(session, &sock, std::ref(logger));
この方法では、ロガーはコピーされず、その参照がスレッドに渡されます。ロガーはスレッドよりも存続する必要があることに注意してください。
std::thread は引数がコピーされることを期待しているため、この場合 std::move() の使用は推奨されません。オブジェクトを移動すると、そのメモリの所有権がスレッドに移ることになりますが、これは望ましくない可能性があります。
コードが以前は std::move() で動作していたが、現在は失敗する場合は、コンパイラのバージョンが適切でない可能性があります。 C 11 は完全には実装されていません。C 11 のサポートを強化するには、コンパイラを更新することを検討してください。
以上がオブジェクトを参照によって std::thread に渡すとコピー コンストラクターが呼び出されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。