How will we fix opEquals?

Steven Schveighoffer schveiguy at yahoo.com
Thu Feb 10 14:41:56 PST 2011


On Thu, 10 Feb 2011 16:34:57 -0500, Don <nospam at nospam.com> wrote:

> Steven Schveighoffer wrote:
>> On Thu, 10 Feb 2011 15:22:48 -0500, Don <nospam at nospam.com> wrote:
>>
>>> A tiny compromise which could be made, is to silently add 'const' to  
>>> any class opEquals declaration, even if not present in the source.  
>>> That way, simple use cases would still compile without complaint.
>>> (As long as only a single, precisely defined opEquals signature is  
>>> permitted, I think any other signature should be flagged as an error  
>>> -- but it could be converted to the correct signature, instead).
>>>
>>> Dunno if this would be worth it, though.
>>  I think then we get back to  
>> http://d.puremagic.com/issues/show_bug.cgi?id=3659
>
> No, we don't, because that issue applies to structs, not classes. For  
> classes, it has to go in the vtable, so the precise signature must be  
> known.

What I meant was, if the compiler complains that some specific function x  
has the wrong signature, you have assumptions the compiler is making that  
may not be correct.  To me, opEquals is special, but it's still a regular  
function, and putting extra limitations is sure to ferret out some use  
case where the limitation is invalid.

I consider

bool opEquals(int x) const

to be a perfectly valid signature in a class.

>
>> Would it be possible to define a construct that says "you can override  
>> this function, but you cannot add any new overloads"?  like a @precise  
>> or something like that?  Then we can have a real feature to use for  
>> things like this.  Sort of like final, but you're not cutting off the  
>> virtual function path, just restricting the API to be exactly what you  
>> specify.  That way someone cannot accidentally create a non-const  
>> opEquals and generate a hidden function exception.  Although, anyone  
>> worth his salt will test the opEquals, which dmd forces through  
>> .opEquals(const(Object), const(Object)).
>
> For sure that could be done. But again -- does it add much value?

Not really, I don't think it's that big a problem to begin with.  If you  
try comparing two objects and you didn't define your signature right, then  
you get a hidden func error, since they all go through .opEquals(...)  
which casts everything to Object (should be const(Object) ).  So the only  
way this gets out is if you never test the code you wrote.

-Steve


More information about the Digitalmars-d mailing list