On Wed, 09 Mar 2011 11:40:25 -0500, SiegeLord <n...@none.com> wrote:

1) Why does this code not work (dmd 2.051) and how do I fix it:

struct S
{
        static S New()
        {
                S s;
                return s;
        }
        
        const bool opEquals(ref const(S) s)
        {
                return true;
        }
}

void main()
{
        S s;
        assert(s == S.New);
}

Because passing an argument via ref means it must be an lvalue. New() returns an rvalue.

However, that restriction is lifted for the 'this' parameter, so the following should actually work:

assert(S.New() == s);


2) Why is the type of struct opEquals have to be const bool opEquals(ref const(T) s)? Why is it even enforced to be anything in particular (it's not like there's an Object or something to inherit from)?

It's a mis-designed feature of structs.  There is a bug report on it:

http://d.puremagic.com/issues/show_bug.cgi?id=3659

-Steve

Reply via email to