Maison > développement back-end > C++ > Pourquoi ne pouvez-vous pas utiliser « shared_from_this » dans un constructeur ?

Pourquoi ne pouvez-vous pas utiliser « shared_from_this » dans un constructeur ?

DDD
Libérer: 2024-11-06 06:14:02
original
800 Les gens l'ont consulté

Why Can't You Use `shared_from_this` in a Constructor?

Comprendre l'incapacité de Shared_from_this dans les constructeurs

La requête se concentre sur les limitations de l'utilisation de shared_from_this dans un constructeur de classe. Pour résoudre ce problème, explorons les raisons techniques derrière cette restriction.

Le membre caché de Shared_ptr

Shared_from_this est auto-référentiel, s'appuyant sur un membre low_ptr interne ajouté au activate_shared_from_this classe de base. Cependant, ce low_ptr n'est défini qu'après la création du premier shared_ptr to Person.

Chronologie de la construction

Un constructeur de classe est responsable de l'initialisation de ses membres, y compris de la construction du activate_shared_from_this instance de classe de base. Lors de la construction initiale de l'objet, il n'y a pas encore de shared_ptr pointant vers la personne.

La connexion entre Shared_ptr et Weak_ptr

Considérez l'extrait suivant :

 std::shared_ptr<Person> p(new Person());
Copier après la connexion

Avant que le constructeur de p (le shared_ptr) ne soit invoqué, l'expression new Person() doit être évalué, conduisant à la construction de l’objet Person. Étant donné que le constructeur de shared_ptr s'exécute après la création de l'objet Person, l'objet shared_ptr n'existe pas pendant la phase de construction de Person, ce qui rend l'utilisation de shared_from_this impossible.

Conclusion

Techniquement , shared_from_this est inutilisable dans un constructeur car le shared_ptr requis, qui initialise le low_ptr interne, le fait n'existe pas tant que l'objet n'est pas entièrement construit. Cela empêche shared_from_this d'établir la connexion auto-référentielle nécessaire.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal