为什么 std::set 的构造函数要比较相同的元素两次?

Why constructor of std::set compares the same elements two times?

让我们考虑以下示例:

#include <iostream>
#include <set>

struct Obj {
  int x;
  int operator<=> (const Obj& obj) const {
    std::cout << __FUNCTION__ << " " << *this << " " << obj << std::endl;
    return x - obj.x;
  }
  friend std::ostream& operator<< (std::ostream& os, const Obj& obj);
};

std::ostream& operator<< (std::ostream& os, const Obj& obj) {
  return os << "{ x: " << obj.x << " }";
}

int main() {
  std::set<Obj> st2{{1}, {2}};
  return 0;
}

它将产生两行:

operator<=> { x: 1 } { x: 2 }
operator<=> { x: 2 } { x: 1 }

此时我想知道为什么要进行两次比较。

更新:g++-10 版本:10.2.0

它可能会测试它们是否相等。如果您查看 std::set 的模板参数,您会发现它只需要提供一个 less 函数。那么,鉴于我们只有 <,我们如何测试两个元素是否相等?比较两次。如果 !less(a, b) && !less(b, a),则 a == b