On Thu, 29 Sep 2011 14:45:13 -0400, Jonathan M Davis <jmdavisp...@gmx.com> wrote:

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.

Not at all.  You are not forced to use obj == obj to do comparisons.

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.

Mutexes are usable within const functions. They are *always* logically const. It's one of the reasons I think a subset of logical const works well, even if we don't have full-blown support. I still feel there is a logical const solution out there which gets enough of the way there to be useful, but makes circumventing immutable impossible or highly unlikely.

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.

I think the caching/lazy loading *specifically for opEquals* has been blown way out of proportion. I don't think I've ever written one which requires caching to be efficient.

-Steve

Reply via email to