Maison > développement back-end > C++ > Pourquoi « shared_from_this » ne peut-il pas être utilisé dans un constructeur ?

Pourquoi « shared_from_this » ne peut-il pas être utilisé dans un constructeur ?

Mary-Kate Olsen
Libérer: 2024-11-08 12:32:02
original
279 Les gens l'ont consulté

Why Can't `shared_from_this` Be Used in a Constructor?

shared_from_this Limitation du constructeur : explication technique

Contrairement aux idées fausses courantes, l'incapacité de shared_from_this à être utilisé dans un constructeur découle de limitations techniques. Pour comprendre pourquoi, nous examinons les aspects internes de son implémentation.

shared_from_this s'appuie sur un membre privé de la classe de base, activate_shared_from_this, pour stocker un faible_ptr. Cependant, ce low_ptr n’est initialisé qu’à la toute fin du processus de construction. Cela signifie que lorsque le constructeur de la classe dérivée (par exemple, Person) est en cours d'exécution, il n'y a pas encore shared_ptr pointant vers l'objet.

Pour illustrer cela, considérons l'extrait de code du livre :

class Person : public std::enable_shared_from_this<Person> {
   ...
};
Copier après la connexion

La fonction shared_from_this dans la classe Person tenterait d'initialiser le faible_ptr caché en utilisant le premier shared_ptr qui pointe vers un objet de type Personne. Cependant, comme le constructeur de Person est actuellement en cours d'exécution, aucun shared_ptr n'existe.

Cette restriction technique survient car le constructeur de shared_ptr doit être appelé avant qu'une action ne soit entreprise sur l'objet pointé. Par conséquent, le mécanisme shared_from_this ne peut pas fonctionner au sein du constructeur de la classe dérivée, car il n'y a pas de shared_ptr disponible à ce stade.

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