ref parameter qualifier and static arrays

anonymous via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed Sep 9 13:32:21 PDT 2015


On Wednesday, 9 September 2015 at 20:18:57 UTC, 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!):
Note that the upper bound of the slice is exclusive - [0..$-1] is 
not the whole array but everthing except the last entry. To slice 
the whole array, you can use [0..$] or just write
int[42] a;
auto b = a[];

>
> (ref int[] anArray) is not callable using argument types (int[])
>
> I've modified the function declaration and used .ptr when 
> calling it but it seems like a retrograde step for a modern 
> language - although I suppose ref is pretty much the same thing.
>
> In practice I'm using arrays of structs (which are of various 
> fixed sizes and known at compile time) that are currently 
> global in scope - something that I'd like to avoid.
>
> I suppose I could just ask, what is the 'best' way to give 
> access to variously sized static arrays between different 
> modules?

It is impossible to pass a rvalue as a reference (intended 
behaviour, afaik it is causes problems if the reference escapes 
from foo and outlasts the rvalue). There is a bug report about 
the strange error message somewhere in the bug tracker.
Some time ago someone announced to implement passing rvalue as 
reference but it seems the PR was not merged for dmd 2.068.

Workaround:
use a temporary variable.
instead of

int[42] a;
foo(a[]);

write

int[42] a;
auto tmp = a[];
foo(tmp);


More information about the Digitalmars-d-learn mailing list