IMO, if it has a constructor, you pass it by const_reference. Simple as that.

If the function then wants to do something mutable with the object, it's the function's own job to create a copy...