Well if the function is deprecated, you wouldn't change it's signature anyway. I don't see a point in simulating pass by value semantics if that is what we need in the first place. AFAICT the only reason is because you want to support a particular interface.
The reason is that the caller should not care whether to create a copy or not. It's callee responsibility to make a copy if necessary. You might write a better code later, which does not need a copy and the callers will still be making ones.
Yet another example: you might mark this function as deprecated and transfer its job to another function, like this: