Maison  >  Article  >  développement back-end  >  Pourquoi le passage d'un objet de classe par référence à std::thread déclenche-t-il toujours le constructeur de copie ?

Pourquoi le passage d'un objet de classe par référence à std::thread déclenche-t-il toujours le constructeur de copie ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-17 15:54:01375parcourir

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

std::thread Le passage par référence appelle le constructeur de copie

Problème :

Lors du passage un objet de classe Log dans un std::thread par référence, une erreur du compilateur se produit, malgré les attentes selon lesquelles le passage de référence devrait contourner le constructeur de copie. À l'inverse, passer l'objet par un pointeur résout le problème.

Explication :

La raison sous-jacente de ce comportement est que std::thread nécessite que ses arguments soient transmis par valeur. Passer par référence, comme dans Log &logger, a le même effet que passer un pointeur, c'est-à-dire qu'il nécessite toujours un constructeur de copie pour générer une copie de l'objet à transmettre au thread.

Solution :

Pour retrouver la sémantique de référence, sử dụng std::reference_wrapper:

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

Remarque :

  1. Assurez-vous que la durée de vie de l'objet référencé (enregistreur dans ce cas) dépasse celle du thread .
  2. Dans le code fourni, le constructeur de copie de Log est privé, empêchant la création de fichiers supplémentaires exemplaires.

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