Initialising invariant associative array
Gide Nwawudu
gide at btinternet.com
Wed Jun 18 04:30:03 PDT 2008
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
More information about the Digitalmars-d-learn
mailing list