Changeset 442, implicit Vs explicit
Don
nospam at nospam.com
Tue Apr 27 06:12:10 PDT 2010
bearophile wrote:
> Do you see a problem here?
>
> import std.stdio: writeln;
> int[24] arr = [10,2,15,15,14,12,3,7,13,5,9,9,7,9,9,9,11,15,1,1,12,5,14];
> void main() {
> writeln(arr);
> }
>
> This code compiles and runs fine, I think according to the D specs, but it can hide a bug.
> (Don has split my bug report to avoid fixing the whole problem. I don't think mine is an enhancement request as Don writes, I think it's a bug in the D specs.)
I share your opinion that it's a poor design, but it's not a bug. It's
explicitly supported in the spec.
By contrast, a literal with too many items is clearly a bug (it's an
array bounds error). Especially when the compiler crashes.
> A third case is when you really want to define a static array using a literal that has less items than the static array. I think this is an uncommon case, what are the real use cases of this? But we might want to support it anyway. Two examples:
>
> int[4] datas = [1, 2];
> int[3][3] mat = [[1,2,3], [4,5,6]];
>
> In D there is another way to write that (using the associative array syntax! this smells bad):
> int[4] datas = [0:1, 1:2];
I do not know why this syntax is supported, but it's in the spec. Note
that you can even write:
int [4] datas = [1:2, 3, 0:1];
That syntax explicitly allows members to remain uninitialized.
(BTW, it's much, much older than associative array syntax).
More information about the Digitalmars-d
mailing list