gpt4 book ai didi

c++ - 为什么 std::tuple 调用 operator <=> 两次?

转载 作者:行者123 更新时间:2023-12-03 10:04:09 24 4
gpt4 key购买 nike

以下代码调用 operator <=> 两次,参数颠倒。但为什么?
GCC 10.2 和 clang 12 似乎都在使用 libstdc++-10,其 确实提供了运算符 <=>,因此它似乎不是缺少标准库支持的情况,我的代码必须不正确。如何解决?

#include <tuple>
#include <compare>
#include <iostream>

struct X {
int i;
auto operator <=>(X const& other) const {
std::cout << this << " <=> " << &other << std::endl;
return i <=> other.i;
}
};

int main() {
std::tuple{X{42}} <=> std::tuple{X{42}};
}

最佳答案

简短回答:您需要定义 operator==X .std::tuple通过使用 <=> 的综合三向比较来比较元素仅当类型满足 std::three_way_comparable_with<T,U> .最终,这需要 std::three_way_comparable<X> ,这需要说明性 weakly-equality-comparable-with概念。正如你可能猜到的,这需要 ==有效。
修复是单行的:

bool operator==(X const& other) const = default;
现在为什么是 ==需要时 <=>似乎在这里自己做这项工作?我只能推测,但这可能是因为概念比我们习惯的更“完整”,只需要 operator<例如。如果一个类型与 <=> 相当,它真的也应该支持平等。
至于为什么 <=>不包括 ==除非默认,否则这是因为其相等性可以短路的类(例如 vector 和字符串)以及包含此类类型的任何类的性能缺陷。没有迹象表明相等比较每个元素而不是短路,所以 <=>不处理相等性,除非它可以保证您将避免该陷阱(通过默认 <=> )。

关于c++ - 为什么 std::tuple 调用 operator <=> 两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66175605/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com