Maison >développement back-end >C++ >Pourquoi `std::thread` semble-t-il appeler le constructeur de copie lors du passage par référence ?

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

Barbara Streisand
Barbara Streisandoriginal
2024-11-15 10:08:021030parcourir

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));

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;
}

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

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