ホームページ  >  記事  >  バックエンド開発  >  オブジェクトを参照によって std::thread に渡すとコピー コンストラクターが呼び出されるのはなぜですか?

オブジェクトを参照によって std::thread に渡すとコピー コンストラクターが呼び出されるのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-15 08:17:02323ブラウズ

Why Does Passing an Object by Reference to std::thread Invoke the Copy Constructor?

std::thread: 参照渡しによるコピー コンストラクターの呼び出し

問題の理解

オブジェクトを std::thread に渡すとき、引数は通常参照されるのではなく、スレッドにコピーされます。この動作は、参照による受け渡しがコピー構築を回避する必要があるという期待に反します。この混乱は、C における参照とポインタの区別から生じています。

コンストラクタのコピーと参照による受け渡し

C では、オブジェクトを参照によって渡すことは、通常、そのアドレスを渡すことを意味し、これは渡すことと同等です。ポインタ。ただし、std::thread には、引数を値によってコピーする必要がある特定の実装があります。

std::reference_wrapper の使用

参照セマンティクスを実現するには、次のように 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。