Функтор + ссылка на полученный shared_ptr:надо ли?

день добрый.есть семпл:
      class Foo;      typedef boost::shared_ptr<Foo> FooPtr;      class MyFunctor{        const FooPtr <span>&</span>_pFooPtr;      public:        MyFunctor(const FooPtr &p) : _pFooPtr(p) {}        bool operator()(const FooPtr &other) const{          //bla bla        }      };
есть ли необходимость хранить полученный shared_ptr по ссылке или это в корне неверно и так в случае shared_ptr-ов делать не следует? сам я ответ на этот вопрос официально нигде не нашел, потому решил сюда запостить. спасибо за пояснение.
9 ответов

чаще всего нужно хранить копию shared_ptr


В данном случае разница лишь в том, что в функторе будет хранится указатель, а не копия. Ну экономия 16 байт, да  Но, я думаю, так делать не стоит. 


я почему решил спросить -- в нек. материалах читал о том, что категорически запрещается так делать. на практике же - работает, ессно.


varnie, так поступать следует только в том случае, если время жизни передаваемого указателя будет больше времени жизни функтора.


Rififi, в точку. у меня именно так и обстоит это дело в коде.


день добрый.есть семпл:
      class Foo;      typedef boost::shared_ptr<Foo> FooPtr;      class MyFunctor{        const FooPtr <span>&</span>_pFooPtr;      public:        MyFunctor(const FooPtr &p) : _pFooPtr(p) {}        bool operator()(const FooPtr &other) const{          //bla bla        }      };
есть ли необходимость хранить полученный shared_ptr по ссылке или это в корне неверно и так в случае shared_ptr-ов делать не следует? сам я ответ на этот вопрос официально нигде не нашел, потому решил сюда запостить. спасибо за пояснение.
Это делать бессмысленно:
  •  Если время жизни параметра p из конструктора МЕНЬШЕ, чем время жизни самого объекта - то будет ошибка при использовании _pFooPtr
  •  Если же время жизни НЕ МЕНЬШЕ, то использование shared_ptr для _pFooPtr (как в виде ссылки, так и в виде объекта) бессмыслено - можно использовать оригинальный голый указатель, а  оригинальный shared_ptr, переданный в конструктор, будет отслеживать время жизни того, куда он указывает


xvr, немного запуталса в ваших пояснениях. в целом, вы имеете ввиду, что нет необходимости передавать в функтор объект, обернутый в shared_ptr, и лучше обойтись просто передачей голого указателя. так?если так, то что же тогда делать если у меня изначально объект(ы) обернут(ы) в shared_ptr(ы), и мне нужно вызвать для него(них) функтор(ы). на лицо лишние манипуляции с получением голого указателя из shared_ptr (чтобы его передать в функтор).


немного запуталса в ваших пояснениях. в целом, вы имеете ввиду, что нет необходимости передавать в функтор объект, обернутый в shared_ptr, и лучше обойтись просто передачей голого указателя. так?
нет, он имеет ввиду что ссылка на шаред не гут в первом случае, и бесполезность во втором. Хотя со вторым я не согласен 


xvr, немного запуталса в ваших пояснениях. в целом, вы имеете ввиду, что нет необходимости передавать в функтор объект, обернутый в shared_ptr, и лучше обойтись просто передачей голого указателя. так?
Я имею в виду, что РЕФЕРЕНС на shared_ptr хранить в любом случае бесполезно - либо сам shared_ptr либо голый указатель (первое предпочтительней)
если так, то что же тогда делать если у меня изначально объект(ы) обернут(ы) в shared_ptr(ы), и мне нужно вызвать для него(них) функтор(ы). на лицо лишние манипуляции с получением голого указателя из shared_ptr (чтобы его передать в функтор).
Метод get поможет