ホームページ  >  記事  >  バックエンド開発  >  引数を参照渡しするときに `std::thread` がコピー コンストラクターをバイパスしないのはなぜですか?

引数を参照渡しするときに `std::thread` がコピー コンストラクターをバイパスしないのはなぜですか?

DDD
DDDオリジナル
2024-11-27 12:04:09926ブラウズ

Why Does `std::thread` Not Bypass Copy Constructors When Passing Arguments by Reference?

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 サイトの他の関連記事を参照してください。

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