On Wed, 03 Aug 2011 06:35:08 -0400, simendsjo <simend...@gmail.com> wrote:
void main() {
assert(is(typeof("") == typeof("".idup))); // both is
immutable(char)[]
assert("" !is null);
assert("".idup !is null); // fails - s is null. Why?
}
An empty string manifest constant (i.e. string literal) still must have a
valid pointer, because it's mandated that the string have a zero byte
appended to it. This is so you can pass it to C functions which expect
null-terminated strings.
So essentially, there is a '\0' in memory, and "" points to that character
with a length of 0
However, idup calls a runtime function which *purposely* asks to make a
copy. However, it's *NOT* required to copy the 'zero after the string'
part.
The implementation, knowing that a null array is equivalent to an empty
array, is going to return null to avoid the performance penalty of
allocating a block that won't be used. If you append, it will simply
allocate a block as needed.
I see no reason the runtime should waste cycles or a perfectly good
16-byte buffer to give you an empty array.
Definitely functions as designed, not a bug. If you would like different
behavior, you are going to have to have a really really good use case to
get this changed.
-Steve