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

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

Barbara Streisand
Barbara Streisandオリジナル
2024-11-17 15:54:01375ブラウズ

Why Does Passing a Class Object by Reference to std::thread Still Trigger the Copy Constructor?

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

問題:

渡すときクラスのオブジェクトが std::thread に参照によって Log されると、参照の受け渡しではコピー コンストラクターがバイパスされるはずであるにもかかわらず、コンパイラ エラーが発生します。逆に、オブジェクトをポインタで渡すと、問題は解決します。

説明:

この動作の根本的な理由は、std::thread が引数を渡す必要があることです。価値。 Log &logger のように、参照による受け渡しには、ポインターを渡すのと同じ効果があります。つまり、スレッドに渡すオブジェクトのコピーを生成するには、やはりコピー コンストラクターが必要です。

解決策:

参照セマンティクスを取り戻すには、std::reference_wrapper:

std::thread newThread(session, &sock, std::ref(logger));

注:

  1. 参照されるオブジェクト (この場合はロガー) の存続期間がスレッドの存続期間を超えていることを確認してください。
  2. 提供されたコードでは、Log のコピー コンストラクターはプライベートであり、追加のコピーの作成を防ぎます。

以上がクラス オブジェクトを参照によって std::thread に渡すと、コピー コンストラクターがトリガーされるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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