On Thursday, September 29, 2011 10:50 Steven Schveighoffer wrote:
> On Thu, 29 Sep 2011 13:48:02 -0400, Peter Alexander
> > The comparison may involve comparing a sub-object that is lazily
> > created. It could also involve computing a cached perfect hash for
> > faster comparison, requiring memoization.
> 
> Neither of these are required for opEquals to work. They are
> optimizations.

True, but by making opEquals const and only const, you're disallowing such 
optimzations. It becomes impossible for someone to do any kind of lazy loading 
at all. So, in principle, I definitely think that opEquals should be const, 
and practically-speaking it _needs_ to be const for const to work properly, 
but if we make it _only_ const, then we're disallowing some performance-
related stuff that some people care a lot about. Also, if we force opEquals to 
be const, then those classes that just _can't_ be const and work properly 
(e.g. those that _require_ logical const to even work - like if they have a 
mutex) won't be usable at all. So, making it both seems to be the only real 
option.

Though come to think of it, since you _still_ can't have lazy loading when a 
const opEquals even _exists_, you're either still going to have to forgoe lazy 
loading, make the const opEquals throw, or get nasty bugs when the non-
overridden base class version of opEquals gets thrown. So, this could be even 
worse than we were thinking...

I'm not quite sure what the correct solution is then. By having both, we allow 
for both paradigms but make the use of const opEquals potentially buggy in the 
cases where someone insists on doing lazy loading. But if we insist on only 
having the const opEquals, then some folks are going to get an unavoidable 
performance hit in their programs. If caching is the only issue, then it's a 
non-issue, because the const versions just become less efficient in the cases 
where the value is dirty, but if the state of the function actually needs to 
be changed for opEquals to work (e.g. lazy loading or internal mutexes), then 
we're going to have cases where the const opEquals can't possibly work 
correctly.

This is ugly.

- Jonathan M Davis

Reply via email to