On Saturday, 15 June 2019 at 16:34:22 UTC, Robert M. Münch wrote:
On 2019-06-15 16:19:23 +0000, Anonymouse said:
By design, I think: "delegate and function objects cannot be
mixed. But the standard function std.functional.toDelegate
converts a function to a delegate."
Your example compiles if the assignment is changed to dg =
toDelegate(&myFunc); (given appropriate imports).
https://tour.dlang.org/tour/en/basics/delegates
https://dlang.org/phobos/std_functional.html#.toDelegate
Hmm... but this here compiles:
void main()
{
import std.stdio: write, writeln, writef, writefln;
void foo(int a) {return; }
void test()
{
void delegate(int) dg;
dg = &foo;
}
}
See: https://run.dlang.io/is/U7uhAX
Is it because inside main() there is a stack frame? And with a
global function there is none? I'm a bit confused...
yes. delegate is a function pointer + its context. At the global
scope there's no context. Actually the following works fine:
---
void foo(){writeln(__PRETTY_FUNCTION__);}
void main(string[] args)
{
void delegate() dg;
dg.funcptr = &foo;
dg.ptr = null; // usually a "this" or a frame address
dg();
}
---
because dg.ptr would be used to retrieve the offset of the locals
variable used in the parent stack or the address of a class
instance (the this). But this is not required at all here. The
opposite way would lead to various access violation.