Я хочу передать объект по умному указателю в функцию.Функция может изменить значение ссылочного объекта, но не может изменить саму ссылку.Есть два очевидных способа справиться с этим.
Первый подход к передаче shared_ptr по значению - это , это ссылка, поэтому сам по себе нет необходимости передавать по ссылке.Очевидной проблемой при этом является копирование ссылки, что предполагает некоторые накладные расходы на подсчет ссылок.
void foo (shared_ptr<bar> p)
Второй подход заключается в передаче shared_ptr по константной ссылке - избегая копирования экземпляра shared_ptr, но вместо этогоподразумевается, что доступ к объекту, на который ссылаются, требует двух уровней разыменования вместо одного.
void foo (const shared_ptr<bar> &p)
На практике эти теоретические накладные расходы обычно будут тривиальными и неуместными.Что наводит меня на мысль, что вместо того, чтобы выбирать один или другой подход для каждого отдельного случая, я почти всегда должен следовать некоторому стандартному соглашению.Что приводит к вопросу ...
Существует ли стандартное соглашение о том, какой из этих подходов я обычно выбираю?Если да, то каков обычный выбор?
РЕДАКТИРОВАТЬ - Вероятно, стоит упомянуть - одна из причин для рассмотрения случая передачи по константной ссылке состоит в том, что существует уже существующее соглашение, которое в большинствеэкземпляры класса / структуры передаются по const-ссылке, а не по значению, а shared_ptr
является классом.Конечно, это не тяжеловесный класс (стоимость копирования невелика), поэтому причины этого более старого соглашения могут не применяться.