I recently frequently encounter the situation where I need to both copy as well as optionally convert an object. It turns out `convert` on its own will not do the job in this case as it doesn't create a copy if the conversion is trivial:
julia> v = Vector{Int}(); julia> convert(Vector{Int}, v) === v true julia> convert(Vector{Float64}, v) === v false So to be safe I have to write `copy(convert(NewT,obj))`, but that creates two copies in case `NewT != obj` [1]. I assume this must be a fairly common problem, and I am surprised Julia doesn't offer a solution to it. The following is a first attempt at a solution, but I would not be surprised if there are edge cases where this approach fails. function copyconvert{T}(::Type{T}, x) y = convert(T,x) if y === x return copy(x) else return y end end [1] In C++, the compiler would optimise this case down to one copy ("copy elision"), but I assume the Julia compiler doesn't. Correct?