Description
So a discussion came un on slack that this behaviour
julia> x = UInt8[73, 74]
2-element Array{UInt8,1}:
0x49
0x4a
julia> String(x)
"IJ"
julia> x
0-element Array{UInt8,1}
is fairly surprising.
One normally expects that function calls be explicit if they mutate data and I think cosntructors like String
should be held to similar standards. I see there was some discussion in #26093, and the conclusion seemed to be that since there is no type String!
then naming the constructor String!
doesn't make sense, especially because (according to those more knowledgable than I) nearly 100% of uses of String
want the memory stealing behaviour.
I think it is worth revisiting this issue. I'd argue that even though one usually wants memory stealing, it's best to always be explicit if that is happening, either through a keyword argument, e.g. String(x, steal=true)
, or through a different constructor name String!
.
The current behaviour seems like a real footgun to me, even if it's convenient when you know what you're doing.