Implicit static->dynamic arr and modifying

Jonathan M Davis via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue May 6 01:06:14 PDT 2014


On Mon, 05 May 2014 22:16:58 -0400
Nick Sabalausky via Digitalmars-d-learn
<digitalmars-d-learn at puremagic.com> wrote:

> On 5/5/2014 10:11 PM, Nick Sabalausky wrote:
> > Is this kinds stuff a sane thing to do, or does it just work by
> > accident?:
> >
> > void modify(ubyte[] dynamicArr)
> > {
> >      dynamicArr[$-1] = 5;
> > }
> >
> > void main()
> > {
> >      ubyte[4] staticArr = [1,1,1,1];
> >      modify(staticArr);
> >      assert(staticArr == [1,1,1,5]);
> > }
>
> Duh, it's just using a normal slice of the static array...
>
> // Roughly:
> dynamicArr.ptr = &staticArr;
> dynamicArr.length = typeof(staticArr).sizeof;
>
> So all is well, and deliberately so. Pardon the noise.

It's definitely deliberate, though I think that it's a flaw in the language's
design. IMHO, static arrays should never be automatically sliced, but
unfortunately, changing that would break too much code at this point. The
biggest problem is the fact that it's inherently unsafe, though unfortunately,
the compiler currently considers it @safe:

https://issues.dlang.org/show_bug.cgi?id=8838

- Jonathan M Davis


More information about the Digitalmars-d-learn mailing list