Как правильно сохранить ссылку на объект с помощью shared_ptr? - PullRequest
0 голосов
/ 21 мая 2018

В чем разница между использованием std :: shared_ptr с & и без для сохранения ссылки на объект?

class A{};

class B
{
private:
    std::shared_ptr<A>&obj; // or std::shared_ptr<A>obj;
public:
    B(std::shared_ptr<A>r) : obj(r) {}
};

int main()
{
    std::shared_ptr<A>a(new A());
    std::unique_ptr<B>b(new B(a));
    std::cin.get();
    return 0;
}

1 Ответ

0 голосов
/ 21 мая 2018

Создание B::obj ссылки одинаково, независимо от ее типа.Ссылка - это ссылка, это ссылка, не имеет значения, является ли она ссылкой на int или std::shared_ptr<A>.

И обратите внимание, что, поскольку вы передаете аргумент конструктора B по значению,когда конструктор вернется, он выйдет из области видимости, и любая ссылка на r будет недействительной.

Наконец, на самом деле нет смысла сохранять ссылку на std::shared_ptr.Иногда имеет смысл передать std::shared_ptr ссылочный аргумент, но на самом деле не хранить такую ​​ссылку.Ссылка на объект std::shared_ptr, а не на то, на что указывает std::shared_ptr, использование ссылки не увеличит внутренний счетчик и не будет использовать семантику совместного владения std::shared_ptr.

Inдругими словами: не сохраняйте ссылки на std::shared_ptr.

...