static arrays becoming value types

grauzone none at example.net
Mon Oct 19 19:49:22 PDT 2009


Jason House wrote:
> Walter Bright Wrote:
> 
>> Currently, static arrays are (as in C) half-value types and 
>> half-reference types. This tends to cause a series of weird problems and 
>> special cases in the language semantics, such as functions not being 
>> able to return static arrays, and out parameters not being possible to 
>> be static arrays.
>>
>> Andrei and I agonized over this for some time, and eventually came to 
>> the conclusion that static arrays should become value types. I.e.,
>>
>>    T[3]
>>
>> should behave much as if it were:
>>
>>    struct ??
>>    {
>>       T[3];
>>    }
>>
>> Then it can be returned from a function. In particular,
>>
>>    void foo(T[3] a)
>>
>> is currently done (as in C) by passing a pointer to the array, and then 
>> with a bit of compiler magic 'a' is rewritten as (*a)[3]. Making this 
>> change would mean that the entire array would be pushed onto the 
>> parameter stack, i.e. a copy of the array, rather than a reference to it.
>>
>> Making this change would clean up the internal behavior of types. 
>> They'll be more orthogonal and consistent, and templates will work better.
>>
>> The previous behavior for function parameters can be retained by making 
>> it a ref parameter:
>>
>>     void foo(ref T[3] a)
> 
> I've never heard the argument why they should be value types. Can you or Andrei explain why it makes more sense as value types?

Because they are some bastardization now. Neither slice, nor reference 
type, nor value type. Somehow, they behave like value type when declared 
in a struct or a variable. (Because they allocate memory for the 
contents they point to.) But if you pass them as argument, they behave 
like reference type (they're just pointers to the actual data). And you 
can't return them at all from functions for unknown reasons. It's a real 
WTF.

The only clean way to fix them is the as described by Walter.



More information about the Digitalmars-d mailing list