在C++20中,std::vector运算符==不适用于具有不同分配器的向量,这是有原因的吗



注意:

我知道通常的原因是可能的:没有人想过/写过论文/WG21认为这不值得付出努力,我更感兴趣的是阻碍潜在实现的技术问题,而不是这个功能的实用价值。

我总是觉得奇怪的是,这不起作用(甚至在概念出现之前,因为我们可以使用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;
}

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

所以我的问题是:如果我们想用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)适用于异构矢量。

最新更新