On Wednesday 09 September 2015 22:18, Paul wrote: > > Is it possible to call a function like this... > > void foo(ref int[] anArray) > > ...with slices of static arrays? I thought I might be able to use > [0..$-1] but to no avail - I get an error like this (which is > confusing!): > > (ref int[] anArray) is not callable using argument types (int[])
Slice expressions are not lvalues (can't take their addresses), so you can't pass them in ref parameters. You can store the slice in a variable and pass that: ---- void f(ref int[] x) {} int[3] a; version(none) f(a[]); /* Nope, a[] is not an lvalue. */ int[] s = a[]; f(s); /* Ok, s is an lvalue. */ ---- But if you want to pass slice expressions, then you probably don't need that ref. When you pass a slice (without ref), what's actually passed is a pointer and length. The contents are not copied. That means, when you alter an array element, the change will be done the original, even without ref: ---- void f(int[] x) {x[0] = 1;} int[3] a = [0, 0, 0]; f(a[]); assert(a[0] == 1); /* passes */ ---- ref would allow you to resize the original dynamic array: ---- void f(ref int[] x) {x ~= 4;} int[] a = [1, 2, 3]; f(a); assert(a.length == 4); /* passes */ ---- But there's no point in doing that to temporaries like slice expressions.