Initialising invariant associative array

David Ferenczi raggae at ferenczi.net
Wed Jun 18 09:55:14 PDT 2008


Gide Nwawudu wrote:

> On Wed, 18 Jun 2008 10:21:05 +0200, David Ferenczi
> <raggae at ferenczi.net> wrote:
> 
>>The following code gives the following compilation error:
>>
>>src/test/test.d(13): Error: non-constant expression ["s1":cast(FOO
>>9223372036854775808LU,"s2":cast(FOO)4611686018427387904LU]
>>src/test/test.d(14): Error: non-constant expression [cast(FOO
>>9223372036854775808LU:"s1",cast(FOO)4611686018427387904LU:"s2"]
>>
>>
>>--------------------------8<------------------------------------
>>import std.stdint: uint_fast64_t;
>>
>>class A
>>{
>>    typedef uint_fast64_t FOO;
>>
>>    static invariant FOO fooValue1 = cast(FOO) 0x8000000000000000LU;
>>    static invariant FOO fooValue2 = cast(FOO) 0x4000000000000000LU;
>>
>>    static invariant FOO[string] fooArray =
>>["s1":fooValue1, "s2":fooValue2];
>>    static invariant string[FOO] strArray = [fooValue1:"s1",
>>fooValue2:"s2"];
>>}
>>
>>int main(string[] args)
>>{
>>    A a;
>>
>>    return 0;
>>}
>>--------------------------8<------------------------------------
>>
>>Can somebody explain me why?
>>
>>Thanks,
>>David
> 
> D uses 'static this' to initialise static members. This is done to
> remove order of evaluation issues. The docs contain more info on
> static constructors, see http://www.digitalmars.com/d/2.0/class.html
> section 'Static Constructors'.
> 
> import std.stdint: uint_fast64_t;
> 
> class A
> {
>     typedef uint_fast64_t FOO;
> 
>     static invariant FOO fooValue1;
>     static invariant FOO fooValue2;
> 
>     static invariant FOO[string] fooArray;
>     static invariant string[FOO] strArray;
> 
>     static this() {
>         fooValue1 = cast(FOO) 0x8000000000000000LU;
>         fooValue2 = cast(FOO) 0x4000000000000000LU;
>     
>         fooArray = ["s1":fooValue1, "s2":fooValue2];
>         strArray = [fooValue1:"s1", fooValue2:"s2"];
>     }
> }
> 
> int main(string[] args)
> {
>     A a;
> 
>     return 0;
> }
> 
> 
> Gide

Thank you very much for your help. Initialising in the static constructor
works well.

Thanks,
David


More information about the Digitalmars-d-learn mailing list