考虑以下两个重载operator<=>:S
#include <compare>
struct S {};
int operator<=>(S, int) { return 0; } #1
S operator<=>(S, S) { return {}; } #2
如果我将一个对象S与 进行比较int,则会为我生成正确的运算符,所以像, or#1这样的表达式就可以了。S{} <= 00 < 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实际存在。为什么这里没有发生操作符的嵌套生成?标准是怎么说的?是否存在静态约束违规?