On Sat, Nov 22, 2014 at 05:57:30PM +0200, ketmar via Digitalmars-d-learn wrote: > On Sat, 22 Nov 2014 15:45:51 +0000 > Eric via Digitalmars-d-learn <digitalmars-d-learn@puremagic.com> wrote: > > > Maybe this is not so lame because change() can take > > any length of static array. > > void change (int[] arr) { > arr[1] = 42; > } > > void main () { > int[$] a = [1, 2, 3]; > change(a);
This is actually really scary that static arrays implicitly decay to a dynamic array slice. It can cause all sorts of problems with escaping dangling references to local variables: Example #1: int[] bad(int[] arr) { return arr; } int[] equallyBad() { int[3] x = [1,2,3]; return bad(x); // oops } Example #2: struct S { int[] data; this(int[] arr) { data = arr; } } S makeS() { int[3] x = [1,2,3]; return S(x); // oops } Example #3: struct S { int[] data; this(int[] arr...) { // red flag data = arr; } } void main() { auto s = S([1,2,3]); // OK auto t = S(1,2,3); // NG } IMO, at the very least, an explicit slice should be required to turn a static array into a dynamic array slice. That way, the programmer at least has to think for 1 second (hopefully more) whether or not he should be passing a slice to a static array. T -- Those who don't understand Unix are condemned to reinvent it, poorly.