www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - struct opEquals does not work with parameter of same type - bug or feature?

reply Sean Eskapp <eatingstaples gmail.com> writes:
I am trying to build a struct with equality testing, using this code:

struct Foo
{
    const bool opEquals(Foo f)
    {
        return true;
    }
}

This gives me the error that the parameter should be of type "ref const Foo".
Fine.

struct Foo
{
    const bool opEquals(ref const Foo f)
    {
        return true;
    }
}

This, however, does not work with code like:

Foo bar()
{
    return Foo();
}

assert(Foo() == bar());

"function Foo.opEquals(ref const const(Foo) f) const is not callable using
argument types (Foo)" and "bar() is not an lvalue".

How can I do this?
Aug 29 2011
parent reply Jonathan M Davis <jmdavisProg gmx.com> writes:
On Monday, August 29, 2011 22:41:26 Sean Eskapp wrote:
 I am trying to build a struct with equality testing, using this code:
 
 struct Foo
 {
     const bool opEquals(Foo f)
     {
         return true;
     }
 }
 
 This gives me the error that the parameter should be of type "ref const
 Foo". Fine.
 
 struct Foo
 {
     const bool opEquals(ref const Foo f)
     {
         return true;
     }
 }
 
 This, however, does not work with code like:
 
 Foo bar()
 {
     return Foo();
 }
 
 assert(Foo() == bar());
 
 "function Foo.opEquals(ref const const(Foo) f) const is not callable using
 argument types (Foo)" and "bar() is not an lvalue".
 
 How can I do this?

http://d.puremagic.com/issues/show_bug.cgi?id=3659 http://stackoverflow.com/questions/6986175/const-ref-and-rvalue-in-d - Jonathan M Davis
Aug 29 2011
parent Sean Eskapp <eatingstaples gmail.com> writes:
== Quote from Jonathan M Davis (jmdavisProg gmx.com)'s article
 On Monday, August 29, 2011 22:41:26 Sean Eskapp wrote:
 I am trying to build a struct with equality testing, using this code:

 struct Foo
 {
     const bool opEquals(Foo f)
     {
         return true;
     }
 }

 This gives me the error that the parameter should be of type "ref const
 Foo". Fine.

 struct Foo
 {
     const bool opEquals(ref const Foo f)
     {
         return true;
     }
 }

 This, however, does not work with code like:

 Foo bar()
 {
     return Foo();
 }

 assert(Foo() == bar());

 "function Foo.opEquals(ref const const(Foo) f) const is not callable using
 argument types (Foo)" and "bar() is not an lvalue".

 How can I do this?

http://stackoverflow.com/questions/6986175/const-ref-and-rvalue-in-d - Jonathan M Davis

Ah, thanks!
Aug 29 2011