Discussion: https://github.com/JuliaLang/julia/issues/12441

On Thursday, July 21, 2016 at 2:49:19 PM UTC-4, gTcV wrote:
>
> 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?
>

Reply via email to