Подтвердить что ты не робот

Как работает std:: enable_shared_from_this:: shared_from_this

Я просто не понимаю, как std::enable_shared_from_this::shared_from_this возвращает общий пэнд, который разделяет право собственности на существующий указатель. Другими словами, вы this:

std::shared_ptr<Foo> getFoo() { return shared_from_this(); }

Итак, когда вы вызываете getFoo, как именно он получает то, что является другим shared_ptr, чтобы разделить владение, а не создавать отдельный shared_ptr, которому принадлежит тот же this.

Мне нужно понять это, чтобы понять, как создать shared_ptr из какого-либо объекта, который увеличивает один и тот же счетчик ссылок и не инициализирует отдельные shared_ptr s.

4b9b3361

Ответ 1

enable_shared_from_this<T> имеет элемент данных weak_ptr<T>. Конструктор shared_ptr<T> может определить, получен ли T из enable_shared_from_this<T>. Если это так, конструктор shared_ptr<T> назначит *this (который является shared_ptr<T>) элементу данных weak_ptr в enable_shared_from_this<T>. shared_from_this() может затем создать shared_ptr<T> из weak_ptr<T>.

Пример возможной реализации:

template<class D>
class enable_shared_from_this {
protected:
    constexpr enable_shared_from_this() { }
    enable_shared_from_this(enable_shared_from_this const&) { }
    enable_shared_from_this& operator=(enable_shared_from_this const&) {
        return *this;
    }

public:
    shared_ptr<T> shared_from_this() { return self_.lock(); }
    shared_ptr<T const> shared_from_this() const { return self_.lock(); }

private:
    weak_ptr<D> self_;

    friend shared_ptr<D>;
};

template<typename T>
shared_ptr<T>::shared_ptr(T* ptr) {
    // ...
    // Code that creates control block goes here.
    // ...

    // NOTE: This if check is pseudo-code. Won't compile. There a few
    // issues not being taken in to account that would make this example
    // rather noisy.
    if (is_base_of<enable_shared_from_this<T>, T>::value) {
        enable_shared_from_this<T>& base = *ptr;
        base.self_ = *this;
    }
}