gpt4 book ai didi

c++ - 用三向运算符嵌套生成比较运算符?

转载 作者:行者123 更新时间:2023-12-03 13:58:45 25 4
gpt4 key购买 nike

考虑以下两个重载 operator<=>S :

#include <compare>

struct S {};

int operator<=>(S, int) { return 0; } #1
S operator<=>(S, S) { return {}; } #2
如果我比较一个对象 Sint , #1将为我生成正确的运算符,因此表达式如 S{} <= 0 , 0 < S{}0 <=> S{}将只是 fine .
但是如果我比较一个对象 S与其他对象 S :
S{} < S{};
那么这将被重写为 (S{} <=> S{}) < 0 .自 (S{} <=> S{})将返回另一个 S ,我们回到原点问题: Sint 比较.目前,我们没有 operator<(S, int) , 所以 #1会为我生成正确的运算符。
但令人惊讶的是,三个编译器都没有对我这样做。 GCC、Clang 和 MSVC all拒绝 S{} < S{}具有相同的错误消息:
no match for 'operator<' (operand types are 'S' and 'int')
这让我很沮丧。自 #1实际存在。为什么这里没有发生运算符的嵌套生成?标准怎么说?是否存在静态约束违规?

最佳答案

这是格式错误的,尽管不可否认,错误消息非常令人困惑。
规则,来自 [over.match.oper]/8是(强调我的):

If a rewritten operator<=> candidate is selected by overload resolution for an operator @, x @ y is interpreted as 0 @ (y <=> x) if the selected candidate is a synthesized candidate with reversed order of parameters, or (x <=> y) @ 0 otherwise, using the selected rewritten operator<=> candidate. Rewritten candidates for the operator @ are not considered in the context of the resulting expression.


表达式 S{} < S{}将解决改写的候选人 (S{} <=> S{}) < 0 .结果表达式不会在其查找中考虑重写的候选者。所以当我们做 S{} < 0 ,那只会寻找 operator< ,而不是 operator<=> .它找不到这样的东西,所以表达式是格式错误的。
<source>:8:14: error: no match for 'operator<' (operand types are 'S' and 'int')
8 | auto x = S{} < S{};
| ~~~~^~~~~
从这个意义上说,错误确实是正确的:没有匹配项,特别是 operator<与那些操作数。虽然如果错误消息有更多的上下文来解释它为什么要寻找它会有所帮助(我在 99629 中提交了一个请求)。

关于c++ - 用三向运算符嵌套生成比较运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66674463/

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