gpt4 book ai didi

c++ - 重载三向比较运算符结果类型的比较运算符

转载 作者:行者123 更新时间:2023-12-02 18:33:26 25 4
gpt4 key购买 nike

在 C++20 中,我们得到了新的三向比较 operator <=> ,通常返回 std::strong_orderingstd::partial_ordering类型。如果类Aoperator <=> ,然后比较其对象a1 < a2被解释为(a1 <=> a2) < 0 .

但是用户可以重载比较运算符,采用 std::strong_ordering 类型的第一个参数第二个参数接受 0文字?例如:

#include <compare>
#include <iostream>

struct A {
std::strong_ordering operator <=>(const A &) const = default;
};

void operator < (std::strong_ordering, std::nullptr_t) {
std::cout << "overloaded< ";
}

int main() {
A{} < A{}; // #1
(A{} <=> A{}) < 0; //#2
}

这里GCC和Clang都调用重载operator < ,即使没有任何关于标准库中存在另一个运算符的警告。可以吗?演示:https://gcc.godbolt.org/z/zEEP45Ezj

MSVC 的行为更有趣。在 #1 中它打印了一个奇怪的错误:

error C2088: '<': illegal for struct

在#2中:

error C2593: 'operator <' is ambiguous
<source>(8): note: could be 'void operator <(std::strong_ordering,std::nullptr_t)'
C:/data/msvc/14.30.30423-Pre/include\compare(189): note: or 'bool std::operator <(const std::strong_ordering,std::_Literal_zero) noexcept' [found using argument-dependent lookup]
<source>(14): note: while trying to match the argument list '(std::strong_ordering, int)'

我个人更喜欢这种行为,但是什么才是正确的行为呢?

最佳答案

该标准没有提及任何关于 unspecified 的内容 输入 strong_ordering的比较,除了它接受文字 0完全正确(并且使用其他任何内容都是未定义的)。

特别是,它没有指定转换文字 0 所涉及的隐式转换序列的类型。到参数的类型。如果实现使用类类型作为参数,那么您将获得一个用户定义的转换序列,该序列会输给您的 operator<0 的标准转换至nullptr_t ;如果它使用 nullptr_t太,则有歧义;如果它使用 int ,那么你的重载就会失败。

只是……不要这样做。

关于c++ - 重载三向比较运算符结果类型的比较运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69136795/

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