On 2014-06-02 08:08, "Marc Schütz" <schue...@gmx.net>" wrote:
On Monday, 2 June 2014 at 06:56:54 UTC, captaindet wrote:
hi,

i stumbled upon something weird - it looks like a bug to me but maybe it is a 
"feature" that is unclear to me.

so i know i can declare function and delegate pointers at module level.
for function pointers, i can initialize with a lambda.
BUT for delegates i get an error - see below

i found out that using module static this(){...} provides a workaround, but why 
is this necessary?

also, if there is a good reason after all then the error message should make 
more sense.

/det

ps: i know there is a shorthand syntax for this.

----
module demo;

int function(int) fn = function int(int){ return 42; };
// ok

int delegate(int) dg = delegate int(int){ return 666; };
// demo.d(6): Error: non-constant nested delegate literal expression 
__dgliteral6

void main(){}

This doesn't work, because a delegate needs a context it can capture, which is 
available only inside of a function.

The workaround is either, as Mr Smith suggests, to use a static
constructor, or you can use std.functional.toDelegate() (probably,
didn't test).

i knew about the static constructor workaround (mentioned it in my OP). works 
in a simple case, but when i tried it in my project proper i hit a run-time 
error: cycle detected between modules ctors/dtors :( could be an unrelated, so 
far undetected bug, will look into it tonight. will try 
std.functional.toDelegate() as well, maybe it will do the trick.

thanks, det

Reply via email to