On Mon, 18 Oct 2010 10:49:25 -0400, Pelle <[email protected]> wrote:

On 10/18/2010 02:41 PM, Steven Schveighoffer wrote:
On Sun, 17 Oct 2010 02:57:02 -0400, Nick Sabalausky <[email protected]> wrote:

Is there a technical reason why the l- and r- values for opEquals must be
const? If the restriction is purely for the intuitive notion that
there's no
heisenstructs, then I have an example I think might be worth
consideration:
lazy caching.

If comparison isn't always needed and requires a potentially expensive
computation that isn't likely needed otherwise (for example, a wrapper
for
string that does case-insensitive comparisons, if it's used in a
situation
that does more assigning/slicing/etc than comparing), then it may make
sense
to wait until an opEquals is called, and then compute the information and
cache it. But that requires mutating state and so can't be done in a
struct
opEquals.

'Course, if there is a technical reason for the restriction, then all
this
is moot.

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

-Steve

Shouldn't the compiler make the opEquals non-const if one of the struct members requires mutability for equality testing? Just a thought.

IMO, opEquals should allow non-const, but only if the type is a value type (no references). This means opEquals on a class should always be const.

Allowing opEquals to modify the original object violates the expectation of opEquals -- you don't expect comparison to change the objects being compared.

But logically, opEquals shouldn't require any specific signature -- it's just another function.

What case were you thinking of for requiring mutablity for equality testing?

-Steve

Reply via email to