考虑这个例子
struct C {
bool operator<(const C&) const = default; // #1
};
int main(){
C c1,c2;
auto r = c1 < c2;
}
GCC和叮当声
report
那个候选人
#1
被隐式删除。
GCC:
'bool C::operator<(const C&) const' is implicitly deleted because the default definition would be ill-formed
叮当声:
defaulted 'operator<' is implicitly deleted because there is no viable three-way comparison function for 'C'
我不确定具体原因是什么。具体来说,原因可能在[class.compare.secondary]中
参数为x和y的运算符函数定义为删除,如果
-
应用于x@y的重载解析([over.match])不会产生可用的候选项,或者
-
通过重载解析选择的候选者不是重写的候选者。
否则,运算符函数将产生x@y。
默认运算符函数在@operator的重载解析中不被视为候选函数
.
令人困惑的是,哪个项目符号决定默认
operator <
已删除。如果我们忽略强调的措辞,我认为原因可能是第二颗子弹,因为
#1
不是被改写的候选人
x < y
但是,如果我们考虑强调的措辞,
#1
不会是一个可行的候选人,因为它是一个
默认运算符函数
,从而将超负荷分辨率应用于
x @ y
不会产生可用的候选者。
那么,究竟是哪条规则决定了候选人
#1
是否被隐式删除?