Подскажите новичку, в каких случаях есть резон передавать объекты по значению функциям,кроме как передача функции непосредственного вызова конструктора.
Похоже, смысла особого в этом действительно нет за исключением по крайней мере одного случая - если копирующий конструктор объекта модифицирует свой аргумент. Это редко бывает, обычно копирующие конструкторы имеют сигнатуру A::A(const A&), но исключения вида A::A(A&) бывают.
Ну вот к примеру - если взять boost::shared_ptr. Передавать его в функцию как const& - не годится, поскольку при копировании он должен увеличить счетчик ссылок.
ну если объект не больше 8-16 байт и у него тривиальный конструктор коирования, то передать по значению будет скорее вскего эффективнее, потому что по ссылке -- будет доступ с косвенной адресацией
>у если объект не больше 8-16 байт и у него тривиальный конструктор коирования, то передать по значению будет скорее вскего эффективнее, потому что по ссылке -- будет доступ с косвенной адресацией
и что при разработке програмных комплексов руководствуются таким правилом?
> shared_ptr... Передавать его в функцию как const& - не годится,
> поскольку при копировании он должен увеличить счетчик ссылок.
В передаче shared_ptr по ссылке нет ничего криминального,
да копирование не происходит, но может оно и не требуется. В данном
случае shared_ptr надо рассматривать как некоторые абстрактный
пользовательский тип, для которого справедливы следующие принципы:
- Если объект никогда не изменяется, то передовать его надо по
константной ссылке;
- Если объект изменяется, то объект передается по ссылке;
- Если требуется копия объекта, то передовать надо по значению.
> В передаче shared_ptr по ссылке нет ничего криминального,
> да копирование не происходит, но может оно и не требуется.
Я бы сказал
"... да копирования не происходит, но оно здесь лишено смысла."