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 ?
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!