Maison > développement back-end > C++ > le corps du texte

Pourquoi `std::thread` semble-t-il appeler le constructeur de copie lors du passage par référence ?

Barbara Streisand
Libérer: 2024-11-15 10:08:02
original
940 Les gens l'ont consulté

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

std::thread passe par valeur : copie du constructeur appelé

Problème :
Lors de la transmission d'arguments à un thread utilisant std::thread, passant par référence semble appeler le constructeur de copie. Ceci est observé dans le cas où la classe passée a un constructeur de copie désactivé.

Explication :
Par défaut, std::thread prend ses arguments par valeur. Malgré l'apparition d'une référence dans la signature de la fonction, l'argument est en réalité copié dans l'objet thread. Dans l'exemple donné, la classe Log a son constructeur de copie désactivé, d'où l'erreur du compilateur lors de sa transmission par référence.

Solution : Sémantique de référence avec std::reference_wrapper:
À obtenez la sémantique de référence, utilisez std::reference_wrapper pour envelopper l'objet et le transmettre au thread. Cela transmet effectivement une référence à l'objet d'origine sans créer de copie :

std::thread newThread(session, &sock, std::ref(logger));
Copier après la connexion

Déclarations de fonction de thread :
Pour utiliser std::ref, la fonction de thread correspondante doit être modifiée pour accepter un std::reference_wrapper:

static void session(tcp::socket *sock, std::reference_wrapper<Log> logger)
{
    std::cout << " session () " << std::endl;
}
Copier après la connexion

Durée de vie Gestion :
Il est important de s'assurer que l'objet transmis (dans ce cas, l'enregistreur) survit au fil de discussion pour éviter les références pendantes.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal