"" gives an empty string, while "".idup gives null
Jonathan M Davis
jmdavisProg at gmx.com
Wed Aug 3 09:18:43 PDT 2011
On Thursday 04 August 2011 00:27:12 Mike Parker wrote:
> On 8/3/2011 11:23 PM, simendsjo wrote:
> > On 03.08.2011 15:49, bearophile wrote:
> >> simendsjo:
> >>> void main() {
> >>> assert(is(typeof("") == typeof("".idup))); // both is
> >>> immutable(char)[]
> >>>
> >>> assert("" !is null);
> >>> assert("".idup !is null); // fails - s is null. Why?
> >>> }
> >>
> >> I think someone has even suggested to statically forbid "is null" on
> >> strings :-)
> >>
> >> Bye,
> >> bearophile
> >
> > How should I test for null if not with "is null"? There is a difference
> > between null and empty, and avoiding this is not necessarily easy or
> > even wanted.
> > I couldn't find anything in the specification stating this difference.
> > So... Is it a bug?
>
> This is apparently a bug. Somehow, the idup is clobbering the pointer.
> You can see it more clearly here:
>
> void main()
> {
> assert("".ptr);
>
> auto s = "".idup;
> assert(s.ptr); // boom!
> }
I don't know if it's a bug or not. The string _was_ duped. assert(s == "")
passes. So, as far as equality goes, they're equal, and they don't point to
the same memory. Now, you'd think that the new string would be just empty
rather than null, but whether it's a bug or not depends exactly on what dup
and idup are supposed to do with regards to null. It's probably just a side
effect of how dup and idup are implemented rather than it being planned one way
or the other. I don't know if it matters or not though. In general, I don't
like the conflation of null and empty, but is this particular case, you _do_
get a string which is equal to the original and which doesn't point to the
same memory. So, I don't know whether this should be considered a bug or not.
It depends on what dup and idup are ultimately supposed to do.
- Jonathan M Davis
More information about the Digitalmars-d-learn
mailing list