Я думаю, что вопрос более общий, чем единственный оператор ==
.
==
Оператор тесно связана с !=
, и, возможно, связаны с <
, >
, <=
и >=
.
Определение должно быть последовательным среди всех из них, то есть либо можно сравнить два массива разного размера (независимо от используемого сравнения), либо нет.
Я подозреваю, что оба могут быть полезны:
- ошибка времени компиляции: вы предупреждали, что есть что-то подозрительное здесь
- выполнения времени неверно: вы не должны специализироваться все ваши шаблонные методы для обработки разных размеров.
Но только одно дает предупреждение во время компиляции, другое предполагает, что вы надеетесь обнаружить проблему во время выполнения (посредством тестирования).Поэтому я бы обеспечить «безопасный» перегрузки оператора и более подробный метод «мягкого» сравнения:
template <typename T, size_t M, size_t N>
bool soft_equal(array<T,M> const& lhs, array<T,N> const& rhs)
{
if (M != N) { return false; }
// comparison logic
}
template <typename T, size_t M>
bool operator==(array<T,M> const& lhs, array<T,M> const& rhs)
{
return soft_equal(lhs,rhs); // count on the compiler to eliminate the 'if'
}
Таким образом, вы получаете лучшее из обоих миров, я думаю:
- неосторожного предупрежден при компиляции
- ошибка времени компиляции можно решить легко, если она предназначена
Рекомендация: сделать это ео с, чтобы получить это право, и трудно получить это неправильно
Да, это должно быть. Честно говоря, нет ни одного ответа на этот вопрос, который всегда имеет смысл - иногда вам нужно лексическое сравнение, в других случаях это явная логическая ошибка. –
@Jerry: Лексическое сравнение означало бы третий возможный результат: * true *. Однако я не * считаю, что два массива разного размера равны. – fredoverflow
Если это для удовольствия и образования. Сделайте оба. –