Error: non-constant expression...

Jonathan M Davis jmdavisProg at
Fri Nov 26 14:29:03 PST 2010

On Friday 26 November 2010 11:16:08 spir wrote:
> Hello,
> void f () {
>     static string[string] map = ["1":"un", "2":"du", "3":"tri"];
> }
> ==>
> Error: non-constant expression ["1":"un","2":"du","3":"tri"]
> I do not understand what is meant, and what I should do. I need 'static',
> it's a constant value for the func. "static int[] a = [1,2,3];" is OK.
> Where's the difference?
> Also tried const() and immutable(), who knows?, but no way. Search does not
> bring anything for "non-constant expression". (Also: pointer to dmd error
> messages welcome.)

_All_ variables except for non-static local variables must have their 
initializers known at compile time. So, whatever you assign to them must be 
valid with CTFE.

At present, I don't believe that associative arrays are valid CTFE (hence the 
error). The run into the same problem as classes with regards to dynamic memory 
allocation at compile time. It will be fixed at some point, but it hasn't yet 
been fixed, so CTFE still disallows a number of constructs which it is supposed 
to eventually support.

So, you'll have to find a way to either initialize the variable at runtime or 
assign to it at runtime. Given that it's a local variable, you can't use a 
constructor of any variety to initialize it (with a global or class/struct 
variable you could use a static constructor, whereas with member variables, 
you'd use the constructor(s) for the type). So, you may have to do something 
unweildy like declare a second static local variable which is a bool which says 
whether or not map has been initialized. And if it hasn't then assign to it 
(which technically isn't an initialization, since it was initialized at compile 
time - it's just that it was initialized to null). Someone else may have a 
better suggestion though.

- Jonathan M Davis

More information about the Digitalmars-d-learn mailing list