Вы, похоже, путаете то, что делает std :: move, и предполагаете, что оно передает владение объектом.
Это не так.
Все, что делает std :: move, конвертируется в ссылку rvalue, так что можно вызвать соответствующую функцию, которая принимает параметр ссылки rvalue.
Насколько мне известно, вы не можете продлить срок жизни объекта изнутри самого объекта.
В приведенном вами примере вы создаете временный объект класса Foo, который будет уничтожен, как только вернется bar ().
Одна вещь, которую вы можете сделать, это объявить вашу функцию some_func для получения ссылки на rvalue, например:
Bar some_func(std::unique_ptr<Foo>&& someFoo)
{
Bar someBar(std::move(someFoo));
return someBar;
}
int main() {
auto foo = std::make_unique<Foo>();
//do stuff with foo
Bar b = some_func(std::move(foo));
//foo is now invalid, and can't be used;
//b has ownership of foo
return 0;
}
Я не уверен, что это отвечает на ваши вопросы и делает то, что вы ожидаете. Вывод заключается в том, что вместо создания временного объекта вы создаете объект с помощью make_unique и перемещаетесь по уникальному указателю на любой объект, которым вы хотите владеть своим экземпляром.