Есть ли причина, по которой в C ++ оператор std :: vector == не работает для векторов с различными распределителями? - PullRequest
4 голосов
/ 24 марта 2020

Примечание:

Я знаю, что возможны обычные причины: никто не думал об этом / написал документ / WG21 не думал, что это стоит усилий, меня больше интересуют технические проблемы, препятствующие потенциальной реализации, чем полезность этой функциональности заключается в том, что распределители не влияют на значения, хранящиеся в контейнере (я понимаю, что значения могут использовать свой адрес в операторе ==, я говорю о "нормальных" типах).

Итак, мой вопрос: если бы мы хотели сделать это с концепциями C ++ 20, могли бы мы ввести эту функциональность, не нарушая существующий код?

1 Ответ

8 голосов
/ 24 марта 2020

Технических проблем нет. Это, конечно, тривиально реализовать:

template <std::equality_comparable T, typename A1, typename A2>
bool operator==(std::vector<T, A1> const& lhs, std::vector<T, A2> const& rhs) {
    return std::equal(lhs.begin(), lhs.end(), rhs.begin(), rhs.end());
}

И тогда зачем останавливаться на распределителях? Почему я не могу сравнить vector<int> с vector<long>?

P0805 - предложение по расширению набора для сравнения, позволяющего сравнивать контейнеры как смешанного типа, так и смешанного распределителя. Он был одобрен для C ++ 20, но не сделал разрез, и все еще нуждается в некоторой работе, чтобы соответствовать новым концепциям C ++ 20 (в частности, equality_comparable_with требует common_reference: какова общая ссылка между двумя vector с разными распределителями?)

Между тем, std::ranges::equal(v1, v2) работает для гетерогенных векторов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...