delegate issue

captaindet via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Mon Jun 2 07:40:58 PDT 2014


On 2014-06-02 08:08, "Marc Schütz" <schuetzm at 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


More information about the Digitalmars-d-learn mailing list