考虑以下两个重载operator<=>
:S
#include <compare>
struct S {};
int operator<=>(S, int) { return 0; } #1
S operator<=>(S, S) { return {}; } #2
如果我将一个对象S
与 进行比较int
,则会为我生成正确的运算符,所以像, or#1
这样的表达式就可以了。S{} <= 0
0 < S{}
0 <=> S{}
但是,如果我将一个对象S
与其他对象进行比较S
:
S{} < S{};
那么这将被重写为(S{} <=> S{}) < 0
. 既然(S{} <=> S{})
会返回一个 other S
,我们回到原点问题:S
与 a 比较int
。目前,我们没有operator<(S, int)
,因此#1
将为我生成正确的运算符。
但令人惊讶的是,三个编译器都没有对我这样做。GCC、Clang 和 MSVC都拒绝S{} < S{}
并显示相同的错误消息:
no match for 'operator<' (operand types are 'S' and 'int')
这让我很沮丧。由于#1
实际存在。为什么这里没有发生操作符的嵌套生成?标准是怎么说的?是否存在静态约束违规?