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