is this a betterC bug ?

Mike Franklin slavo5150 at yahoo.com
Wed Aug 15 10:54:46 UTC 2018


On Wednesday, 15 August 2018 at 08:14:53 UTC, Petar Kirov 
[ZombineDev] wrote:

> It's not a bug, it's all about how the type system is set up. 
> The type of an array literal expression like `[1, 2, 3]` is 
> `int[]` (a slice of an array of ints), so no matter if you do:
>
> auto readonly(T)(const(T)[] x) { return x; }
>
> auto             arr1 = [1, 2, 3];
> auto             arr2 = [1, 2, 3].readonly;
> const            arr3 = [1, 2, 3];
> enum             arr4 = [1, 2, 3];
> static immutable arr5 = [1, 2, 3];
> scope            arr6 = [1, 2, 3];
>
> In all instances the type will be `int[]` modulo type 
> qualifiers.
>
> Static arrays are completely different types, that just happen 
> to accept
> assignments from slices. Their two defining properties are:
> 1. Their length is fixed at compile-time, meaning that you can 
> do:
>
> import std.array, std.meta;
> auto x = [1, 2, 3, 4, 5].staticArray;
> enum length = x.length;
> pragma (msg, length);
> alias seq = AliasSeq!(0, 42, length);
> static foreach (i; 0 .. length) { }
> static foreach (i; seq) { }
>
>
> 2. Where slices are reference types, static arrays are value 
> types which means that each assignment will copy an entire 
> array.
>
> Basically they behave like a `struct { int _arr_0 = 0, _arr_1 = 
> 1, _arr_2 = 2; }`.
>
> https://run.dlang.io/is/iD9ydu

Thanks for the detailed explanation; it make sense now.

Mike


More information about the Digitalmars-d-learn mailing list