Maison >développement back-end >C++ >Pourquoi passer un objet par référence à std::thread appelle-t-il le constructeur de copie ?

Pourquoi passer un objet par référence à std::thread appelle-t-il le constructeur de copie ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-15 08:17:02395parcourir

Why Does Passing an Object by Reference to std::thread Invoke the Copy Constructor?

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

Comprendre le problème

Lors du passage d'objets à std::thread, les arguments sont généralement copié dans le fil de discussion, plutôt que d'être référencé. Ce comportement contredit l'attente selon laquelle le passage par référence devrait éviter la construction de copie. La confusion vient de la distinction entre références et pointeurs en C .

Copier le constructeur et passer par référence

En C , passer un objet par référence signifie généralement passer son adresse, ce qui équivaut à passer un pointeur. Cependant, std::thread a une implémentation spécifique qui nécessite que ses arguments soient copiés par valeur.

Utilisation de std::reference_wrapper

Pour obtenir la sémantique de référence, utilisez std::reference_wrapper comme suit :

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

De cette façon, logger n'est pas copié, mais sa référence est plutôt transmise au thread. Notez que l'enregistreur doit survivre au thread.

Sémantique de déplacement

L'utilisation de std::move() n'est pas recommandée dans ce cas car std::thread s'attend à ce que les arguments soient copiés. Déplacer l'objet transférerait la propriété de sa mémoire au thread, ce qui n'est peut-être pas souhaité.

Si votre code fonctionnait auparavant avec std::move() mais échoue maintenant, il est possible que votre version du compilateur n'implémente pas entièrement C 11. Pensez à mettre à jour votre compilateur pour une prise en charge améliorée de C 11.

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