On Thursday, 10 October 2013 at 17:47:54 UTC, Namespace wrote:
----
import std.stdio;
void foo1(void function(void*) fp) { }
void foo2(void function(int) fp) { }
void foo3(void*) { }
void main()
{
foo1((void* ptr) => ( assert(ptr is null) ));
foo2((int a) => ( a + 1 )); /// Fails: Error: function foo2
(void function(int) fp) is not callable using argument types
(int function(int a) pure nothrow @safe)
foo1(&foo3);
void foo4(void function(void*) fp) { }
foo1(&foo4); /// Fails: Error: function foo1 (void
function(void*) fp) is not callable using argument types (void
delegate(void function(void*) fp))
}
----
Can someone explain that to me?
You are using short lambda syntax "a => b". Here `b` is always
return statement. It is equivalent to "(a) { return b; }". And
your `foo2` signature expects lambda returning void, like "(a) {
return; }"
Second error is DMD incompetence in deducing minimal required
type of nested function. It always treats them as delegates (==
having hidden context pointer) even if those do not refer any
actual context. And plain lambdas are of course binary
incompatible with delegates (closures) because of that extra
pointer field.