首页 > 解决方案 > std::array 的比较运算符

问题描述

标准库提供的 比较仅operator==适用于大小相等的数组。std::array例如,以下代码无法编译

#include <array>

int main()
{
   std::array<int, 2> a{1, 3};
   std::array<int, 3> b{1, 2, 3};
   bool x = (a == b);
}

将大小不等的数组之间的比较定义为始终为假似乎是合乎逻辑的。但是,按照标准,不允许对operator==非用户定义的类型进行重载。始终可以选择定义比较函数,例如

template <typename U, std::size_t N, std::size_t M>
bool compare(const std::array<U, N>& a, const std::array<U, M>& b) noexcept
{
    if constexpr (N == M) {
       return (a == b);
    }
    else {
       return false;
    }
}

这样的解决方案是不方便的,因为这意味着compare(a, b)当有机会时必须始终使用语法a并且b具有不同的大小。

标签: c++operator-overloadingstdarray

解决方案


标准库没有像上面的代码那样定义 operator== 是否有根本原因?

标准库没有定义它的最根本原因是:没有提出这样的 operator== 。这是将包装器添加到标准中的建议。它不包含不提供模板不同实例之间比较的理由。文件中没有证据表明甚至考虑过这种运营商。


推荐阅读