Есть ли для этого веская причина? Почему выполнение сравнения по элементам будет проблемой?
Функционально это не может быть проблемой, но с точки зрения производительности сравнение по элементам по умолчанию может оказаться более неоптимальным, чем назначение / копирование по умолчанию между членами. В отличие от порядка назначения, порядок сравнения влияет на производительность, потому что первый неравный элемент подразумевает, что остальные могут быть пропущены. Поэтому, если есть некоторые члены, которые обычно равны, вы хотите сравнить их последними, и компилятор не знает, какие члены с большей вероятностью будут равны.
Рассмотрим этот пример, где verboseDescription
- длинная строка, выбранная из сравнительно небольшого набора возможных описаний погоды.
class LocalWeatherRecord {
std::string verboseDescription;
std::tm date;
bool operator==(const LocalWeatherRecord& other){
return date==other.date
&& verboseDescription==other.verboseDescription;
// The above makes a lot more sense than
// return verboseDescription==other.verboseDescription
// && date==other.date;
// because some verboseDescriptions are liable to be same/similar
}
}
(Конечно, компилятор будет иметь право игнорировать порядок сравнений, если он признает, что они не имеют побочных эффектов, но, вероятно, он все равно будет получать свою очередь из исходного кода, где он не имеет лучшей информации о своем владеть.)