Функция, которая принимает shared_ptr
, говорит о том, что она делает. Он говорит: «Я хочу претендовать на совместное владение этим объектом». Если это не так, то это плохо написанная функция, которая вообще не должна принимать shared_ptr
.
Функция, которая принимает значение, не являющееся const
ссылкой на объект, означает, что функция может изменять объект, но не может претендовать на владение. Если у вас нет чего-либо, вы также не можете передать право собственности кому-либо еще.
Теперь вы можете выполнить этот трюк, используя пустую функцию удаления:
void EmptyDeleter(Obj *) {}
double g(Obj& object)
{
boost::shared_ptr<Obj> p(&object, EmptyDeleter);
double x = f(p);
...
}
Однако, вы сейчас лежите до f
. Ему не принадлежит object
; он не может владеть object
. Вполне возможно, что object
является стековым объектом, который может исчезнуть в любое время после завершения f
. Если f
является членом класса, он может сохранить shared_ptr
в переменной-члене. В этот момент у него будет shared_ptr
до мертвого объекта . Это именно то, что shared_ptr
s предназначены для предотвращения.
Правильный ответ для f
, чтобы не принимать аргумент shared_ptr
(используйте указатель не const
или указатель не const
, если он изменяемый, и const&
, если он не изменяемый ) или для g
, чтобы получить аргумент shared_ptr
.