为什么在 C++20 中 std::vector 运算符 == 不适用于具有不同分配器的向量?

Is there a reason why in C++20 std::vector operator == does not work for vectors with different allocators?

注:

我知道通常的原因是可能的:没有人想到 it/wrote paper/WG21 认为不值得付出努力,我对阻碍潜在实施的技术问题比对价值更感兴趣此功能的效用。

我总是觉得这不奇怪 work(甚至在概念之前,因为我们可以使用 enable_if)

#include <vector>
#include  <boost/align/aligned_allocator.hpp>
int main()
{
    std::vector<int> a{1,2,3};
    std::vector<int, boost::alignment::aligned_allocator<int,64>> b{1,2,3};
    return a==b;
}

原因是分配器不会影响存储在容器中的值(我知道值可以在运算符 == 中使用它们的地址,我说的是 "normal" 类型)。

所以我的问题是: 如果我们想用 C++20 概念来做,我们可以在不破坏任何现有代码的情况下引入这个功能吗?

没有任何技术问题。实现起来当然很简单:

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) 适用于异构向量。