Maison >développement back-end >C++ >Pourquoi `std::thread` ne contourne-t-il pas les constructeurs de copie lors de la transmission d'arguments par référence ?

Pourquoi `std::thread` ne contourne-t-il pas les constructeurs de copie lors de la transmission d'arguments par référence ?

DDD
DDDoriginal
2024-11-27 12:04:09956parcourir

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

Std::thread et Copy Constructors : Comprendre l'énigme du passage par référence

std::thread, une partie intégrante de la technologie moderne Les capacités multithreading C présentent un dilemme lors du passage d'objets par référence. Cela est dû à une différence fondamentale entre la façon dont le langage gère les références et la façon dont std::thread traite ses arguments.

Lors du passage d'un objet par référence, nous nous attendons à ce que le constructeur de copie soit contourné car la référence agit comme un alias pour l'objet d'origine. Cependant, cette hypothèse n'est pas vraie pour std :: thread. Voici pourquoi.

Gestion des arguments de std::thread

Contrairement à nos attentes, std::thread transmet ses arguments par valeur. Un objet fonction est déclaré, acceptant les mêmes paramètres que le thread, puis invoqué avec les arguments fournis. Cela signifie que chaque argument est copié dans l'objet fonction, même s'il est passé comme référence.

Constructeurs de copie privée et échec de la compilation

Dans le code fourni, le La classe Log désactive intentionnellement le constructeur de copie en le rendant privé. Lorsque std::thread tente de copier le logger dans l'objet fonction, cela déclenche une erreur de compilation car le constructeur de copie privée est inaccessible.

Résoudre le problème avec std::reference_wrapper

Pour retrouver la sémantique de référence lors du passage d'arguments à std::thread, nous pouvons utiliser std::reference_wrapper. Envelopper la référence avec std::reference_wrapper garantit que l'objet fonction reçoit une référence à l'objet d'origine, évitant ainsi les pièges de la copie de valeur.

Code utilisant std::reference_wrapper

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

Dans cet exemple corrigé, le compilateur est capable de créer correctement l'objet std::thread car le logger est maintenant enveloppé dans std::reference_wrapper, en préservant son statut de référence.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn