为什么在 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)
适用于异构向量。
注:
我知道通常的原因是可能的:没有人想到 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)
适用于异构向量。