ホームページ >バックエンド開発 >C++ >参照渡し時に `std::thread` がコピー コンストラクターを呼び出しているように見えるのはなぜですか?

参照渡し時に `std::thread` がコピー コンストラクターを呼び出しているように見えるのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-15 10:08:021031ブラウズ

Why Does `std::thread` Appear to Call the Copy Constructor When Passing by Reference?

std::thread が値渡し: コピー コンストラクターが呼び出されます

問題:
に引数を渡すときstd::thread を使用するスレッドが参照渡しでコピー コンストラクターを呼び出しているようです。これは、渡されたクラスに無効なコピー コンストラクターがある場合に発生します。

説明:
デフォルトでは、std::thread は引数を値で受け取ります。関数シグネチャ内に参照が表示されているにもかかわらず、引数は実際にはスレッド オブジェクトにコピーされます。この例では、Log クラスのコピー コンストラクターが無効になっているため、参照渡し時にコンパイラ エラーが発生します。

解決策: std::reference_wrapper:
To による参照セマンティクス参照セマンティクスを実現するには、std::reference_wrapper を使用してオブジェクトをラップし、スレッドに渡します。これにより、コピーを作成せずに元のオブジェクトへの参照が効果的に渡されます:

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

スレッド関数宣言:
std::ref を使用するには、対応するスレッド関数を変更する必要がありますstd::reference_wrapper:

static void session(tcp::socket *sock, std::reference_wrapper<Log> logger)
{
    std::cout << " session () " << std::endl;
}

ライフタイムを受け入れるには管理:
ダングリング参照を避けるために、渡されたオブジェクト (この場合はロガー) がスレッドよりも存続するようにすることが重要です。

以上が参照渡し時に `std::thread` がコピー コンストラクターを呼び出しているように見えるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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