On Thu, 19 Nov 2015 03:53:46 +0000, Meta wrote: > On Wednesday, 18 November 2015 at 23:53:01 UTC, Chris Wright wrote: >> --- >> char[] buffer; >> if (buffer.length == 0) {} >> --- > > This is not true. Consider the following code: > > import std.stdio; > > void main() > { > int[] a = [0, 1, 2]; > //4002E000 3 > writeln(a.ptr, " ", a.length); > //Is not triggered, obviously assert(a == null); > > a.length = 0; > //4002E000 0 > writeln(a.ptr, " ", a.length, " ", a); > //Is not triggered, not as obvious assert(a == null); > } > > There are cases when an array may have 0 length but a non-null pointer. > If you want to check if an array's length is 0, you must explicitly > check its length member. Checking if an array is equal to null only > compares its pointer field to null. It does *not* check the length.
I tested the behavior and it matches what I said earlier: --- auto c = "hello world".dup; auto b = c[0..0]; writeln(b == null); // prints true writeln(b.ptr == null); // prints false --- This is because array comparison is a memberwise comparison and not a reference comparison, as you can see more clearly with: --- enum int[] a = [1, 2, 3]; writeln(a == a.dup); // prints true --- Or you can check the runtime's implementation of array equality at https://github.com/D-Programming-Language/druntime/blob/master/src/ object.d#L437 . Just for fun, is an array ever not equal to itself?