int delegate(int delegate(ref int)) doIter() const
{
74 return (int delegate(ref int) dg)
{
cast(typeof(this))(this).doIter()
77 (
78 (ref int i)
{
int copy = i; dg(copy);
}
);
}
}
I see what you are doing there. Unfortunately, the innermost
delegate (the one doing the copy trick) somehow got @system
attribute, which leads to the following compile errors (I added
line numbers and reordered your code in the citation above):
constiter.d(78): Error: cannot implicitly convert expression
(__dgliteral2) of type void delegate(ref int i) @system to int
delegate(ref int)
constiter.d(77): Error: cast has no effect in expression
(cast(const(Container))this.doIter()((__error)))
constiter.d(74): Error: cannot implicitly convert expression
(__dgliteral1) of type void delegate(int delegate(ref int) dg)
@system to int delegate(int delegate(ref int))
Where does this @system come from? How do I get rid of it?
Until
int delegate(ref inout int) opApply() inout;
and
int delegate(int delegate(ref inout int)) doIter() inout;
are made to work. (I actually don't know if there is any
obstacles to do this).
Can you point me to the bugreport so I can vote for it? I'm not
sure if it is #4838 or if they are unrelated.