Maison  >  Article  >  développement back-end  >  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
Mary-Kate Olsenoriginal
2024-11-08 12:32:02190parcourir

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> {
   ...
};

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