Home  >  Article  >  Backend Development  >  Why Can't You Use `shared_from_this` in a Constructor?

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

DDD
DDDOriginal
2024-11-06 06:14:02648browse

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

Understanding the Inability of Shared_from_this in Constructors

The query focuses on the limitations of using shared_from_this within a class constructor. To address this, let's explore the technical reasons behind this restriction.

The Shared_ptr's Hidden Member

Shared_from_this is self-referential, relying on an internal weak_ptr member added to the enable_shared_from_this base class. However, this weak_ptr is only set after the first shared_ptr to Person is created.

Construction Timeline

A class constructor is responsible for initializing its members, including constructing the enable_shared_from_this base class instance. During the initial object construction, there is no shared_ptr pointing to the Person yet.

The Connection between Shared_ptr and Weak_ptr

Consider the following snippet:

 std::shared_ptr<Person> p(new Person());

Before the constructor of p (the shared_ptr) is invoked, the expression new Person() must be evaluated, leading to the Person object's construction. Since the shared_ptr's constructor runs after the Person object is created, the shared_ptr object does not exist during Person's constructor phase, rendering the use of shared_from_this impossible.

Conclusion

Technically, shared_from_this is unusable within a constructor because the required shared_ptr, which initializes the internal weak_ptr, does not exist until the object is fully constructed. This prevents shared_from_this from establishing the necessary self-referential connection.

The above is the detailed content of Why Can't You Use `shared_from_this` in a Constructor?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn