Разыменование общего указателя и присвоение ему - PullRequest
0 голосов
/ 29 июня 2018

Можно ли разыменовать общий указатель, назначить и назначить ему новый объект следующим образом:

void foo()
{
    std::shared_ptr<std::string> x =
            std::make_shared<std::string>();

    bar(*x); // is this fine?
    // x == bsl::string("WHATEVER")
}

void bar(string& y)
{
    y = string("whatever");
}

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Да, это действительно. Оператор * возвращает результат разыменования сохраненного (необработанного) указателя.

Разыменование указателя (необработанного) указателя не создает копию и не возвращает временное значение: Разыменование указателя при передаче по ссылке

0 голосов
/ 29 июня 2018

Это нормально, но я бы использовал оператор shared_ptr::get(), чтобы быть более очевидным в том, что мы не используем необработанный указатель.

void foo()
{
    std::shared_ptr<std::string> sharedPtr = std::make_shared<std::string>();
    bar(*sharedPtr.get());
}
...