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

Pourquoi std::thread appelle-t-il le constructeur de copie même lors du passage par référence ?

Linda Hamilton
Libérer: 2024-11-16 15:22:03
original
187 Les gens l'ont consulté

Why Does std::thread Call the Copy Constructor Even When Passing by Reference?

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

Transmettre des données dans un thread à l'aide de std::thread peut être problématique, en particulier lorsqu'il s'agit de classes qui ont désactivé les constructeurs de copie. Ce comportement vient du fait que std::thread prend ses arguments par valeur.

Considérez la classe Log suivante avec un constructeur de copie désactivé :

class Log
{
public:
    Log(const char filename[], const bool outputToConsole = false);
    virtual ~Log(void);

    // ...

private:
    // Disable copy constructor and assignment operator
    Log(const Log &);
    Log &operator=(const Log &);
};
Copier après la connexion

Dans la fonction principale, le Log object logger est passé par référence à la fonction serveur :

Log logger("ServerLog.txt", true);
server(ioService, portNumber, logger);
Copier après la connexion

La fonction serveur crée ensuite un nouveau thread avec logger comme argument :

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

Cependant, cela provoque une erreur du compilateur en raison du constructeur de copie désactivé dans le journal.

Pourquoi le passage par référence appelle-t-il le constructeur de copie ?

Contrairement aux hypothèses courantes, le passage par référence en C n'empêche pas l'invocation du constructeur de copie. Lors du passage d'une référence, le compilateur crée une copie temporaire de l'objet référencé et la transmet à la fonction. En effet, std::thread s'attend à ce que ses arguments soient copiables.

Solution : Utilisation de std::reference_wrapper

Pour obtenir une sémantique de référence dans ce scénario, vous pouvez utiliser std::reference_wrapper:

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

std::ref encapsule une référence de manière à ce que il apparaît comme un objet copiable dans std :: thread. Cependant, vous devez vous assurer que la durée de vie de l'objet sous-jacent (dans ce cas, l'enregistreur) s'étend au-delà de la durée de vie du thread.

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