Проверьте, управляется ли объект, полученный из enable_shared_from_this, shared_ptr? - PullRequest
0 голосов
/ 18 декабря 2018

Предположим, у меня есть класс, полученный из std::enable_shared_from_this

struct foo
  : std::enable_shared_from_this<foo>
{
    std::shared_ptr<foo> get_shared()
    {
        return shared_from_this();
    }

    bool is_shared() const
    {
        /* implementation ??? */
    }
};

foo  A;
auto S= A.get_shared();   // UB (pre c++17) or exception (c++17)

До c ++ 17, похоже, нет способа определить, является ли объект fooфактически управляется shared_ptr.Правильно?

Но даже для c ++ 17 я не уверен, как лучше реализовать такое обнаружение.Один очевидный подход -

bool foo::is_shared() const
{
    try {
        shared_from_this();
    } catch(...) { 
        return false;
    }
    return true;
}

Но можно ли избежать try - catch?Могу ли я использовать weak_from_this()?Как?

1 Ответ

0 голосов
/ 18 декабря 2018

Вы можете реализовать is_shared, используя weak_from_this() в C ++ 17, например:

bool is_shared() const
{
    return !weak_from_this().expired();
}

Это исключение бесплатно и будет возвращаться только true, если объект фактически управляется shared_ptr.

До C ++ 17 нет способа проверить, так как это неопределенное поведение - вызывать shared_from_this(), когда объект не принадлежит shared_ptr.Только когда в C ++ 17 был введен weak_from_this(), мы не смогли получить доступ к закрытому weak_ptr члену std::enable_shared_from_this (через копию), чтобы мы могли проверить состояние определенным образом.

...