У меня класс фу
class Foo;
фабрика, возвращающая на нее указатель:
std::unique_ptr<Foo> createFoo();
и, поскольку Трава сказал мне, что простая функция без специального требования на время жизни Foo должна принимать простые голые указатели:
void plainf(Foo* f);
Как мой клиент должен это делать правильно?
plainF(createFoo());
Он не был бы счастлив, если бы ему пришлось написать:
auto someName = createFoo();
plainF(someName.get());
@hellow, пожалуйста, прочтите ссылку "Herb". Это проясняет. Голые указатели действительно хороши.
Что ж, они хороши в контролируемой среде, где каждый программист знает, что каждый программист знает, что голый указатель означает указатель наблюдателя. Я бы перестраховался и использовал ссылку или дополнительную ссылку.
@jimifiki Конечно, все в порядке, но см. комментарий YSC. Вы можете использовать необработанные указатели везде и вообще не использовать интеллектуальный указатель. Почему один, сырые указатели в порядке, не так ли?
@YSC: std :: экспериментальный :: наблюдатель_птр, конечно. :) и «Нет необязательных ссылок; программа неправильно сформирована, если она создает экземпляр необязательного со ссылочным типом» :-(
@hellow Умные указатели IMO очень ценны. И я согласен с YSC в отношении необработанных указателей: «они хороши в контролируемой среде».
@ Jarod42 Мне стыдно: / да, Observer_ptr - это здорово и все такое, но это экспериментально с тех пор, как умер последний динозавр ...
@Ron: поскольку void plainf(Foo* f); не получает права собственности, вы можете создать утечку памяти.





Вы можете использовать функцию-член get, которая возвращает необработанный указатель на принадлежащий объект.
plainF(createFoo().get());
Временное, созданное createFoo(), не выйдет за рамки, пока plainF не закончит работу. Пока plainF не передает указатель за пределы области видимости, это полностью безопасно.
@NathanOliver Верно, спасибо! Имеет ли смысл говорить тогда, что plainF «не претендует на время жизни Foo», когда на самом деле он отвечает за то, чтобы не передать аргумент «за пределы области видимости»?
@lubgr Передача указателя вверх в основном играет со временем жизни. Передача указателя за пределы области видимости продлит его время жизни, и, поскольку он не владеет указателем, он не должен принимать по нему решения о сроке службы.
Если вам не нужно, чтобы аргумент plainF допускал значение NULL, вы также можете изменить его подпись, чтобы аргумент принимался по ссылке, что позволяет использовать немного менее подробный синтаксис:
std::unique_ptr<Foo> createFoo();
void plainf(Foo& f);
plainF(*createFoo());
Применяются все соображения по сроку службы, упомянутые в Ответ Натана Оливера, поэтому его так же безопасно использовать.
Обратите внимание, что это означает, что createFoo никогда не вернет пустой unique_ptr. Поэтому, если этой функции разрешено не работать, вы должны указать эту ошибку другими способами, например. выбрасывая исключение.
Предполагая, что вы не завершаете программу из-за плохого распределения, вы все равно не можете создать фабрику noexcept (за исключением некоторых конкретных случаев, когда вы владеете выделенной памятью и не используете стандартный new).
Я говорю вам, не используйте голые указатели (да, вы можете процитировать меня по этому поводу;))