Смарт-указатели, как правило, крошечные, поэтому передача по значению не является проблемой, но есть ли какие-либо проблемы с передачей ссылок на них; или, вернее, есть конкретные случаи, когда это не должно быть сделано?
Я пишу библиотеку обертки, а некоторые из моих классов переносят объекты smart-pointer в базовую библиотеку... мои классы не являются умными указателями, но API в настоящее время передают объекты интеллектуального указателя по значению.
например текущий код:
void class::method(const AnimalPtr pAnimal) { ... }
становится
void class::method(const MyAnimal &animal){...}
где MyAnimal
- мой новый класс оболочки, инкапсулирующий AnimalPtr
.
Нет гарантии, что классы Wrapper ни разу не будут расти за пределы смарт-указателя, поэтому переход по значению заставляет меня нервничать.