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
DDDoriginal
2024-11-06 06:14:02719parcourir

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

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