On Saturday, 15 March 2014 at 08:33:13 UTC, Steve Teale wrote:
Doesn't the logic of UFCS rather suggest that this should compile?

struct A
{
   int m;
   void foo(int n) { m += n; }
}

void bar(ref A a, int n)
{
   a.foo(n*n);
}

void delegate(int) dg = &bar;

void main()
{
   A a;
   a.bar(3);
   dg(3);
   assert(a.m == 18);
}

This yes:

struct A
{
    int m;
    void foo(int n) { m += n; }
        
    void bar(int n) {
       foo(n*n);
    }

}

void main()
{
    A a;
    void delegate(int) dg = &a.bar;

    a.bar(3);
    dg(3);
    assert(a.m == 18);
}

yours no.
Because a delegate stores a context ptr aka this. As well as a function pointer. What you were doing meant that no content pointer was being stored. Essentially it was just a function pointer without the first argument added.

Reply via email to