When overloading operator==(), I currently do
bool operator==(const X& lhs, const X& rhs)
{
return &lhs == &rhs || /* member comparisons ... */;
}
meaning I check first for reference equality of the objects and then for equality for all the members. Is this the "proper" way to do it? Are there any gotchas or things to remember? Is this implementation the most efficient way to do it?
Self comparison is usually rare, unless you are an immutable internal pImpl that is usually only compared via ==
in an unordered_
container after a std::hash
collision of your regular wrapper, or something similar.
Optimizing for rare cases is often a bad idea. It adds complexity to the code, and increases testing overhead.
An exception can exist if the comparison is expensive or boundlessly expensive, so that the cost of a failed pointer comparison at the start is trivial. Another exception is where self comparison is unusually expensive, and almost-self (which would be almost as expensive) is exceedingly rare, while self comparison sometimes happens.
The short answer is, keep your code simple, worry about large-order blowups, don't needlessly pessimize, and optimize after actually noticing a performance problem (even if it is just "wow, that was slow", or Monte Carlo profiling).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With