代码之家  ›  专栏  ›  技术社区  ›  xmh0511

删除完全匹配的默认比较运算符函数的原因是什么?

  •  1
  • xmh0511  · 技术社区  · 4 年前

    考虑这个例子

    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的运算符函数定义为删除,如果

    1. 应用于x@y的重载解析([over.match])不会产生可用的候选项,或者
    2. 通过重载解析选择的候选者不是重写的候选者。

    否则,运算符函数将产生x@y。 默认运算符函数在@operator的重载解析中不被视为候选函数 .

    令人困惑的是,哪个项目符号决定默认 operator < 已删除。如果我们忽略强调的措辞,我认为原因可能是第二颗子弹,因为 #1 不是被改写的候选人 x < y 但是,如果我们考虑强调的措辞, #1 不会是一个可行的候选人,因为它是一个 默认运算符函数 ,从而将超负荷分辨率应用于 x @ y 不会产生可用的候选者。

    那么,究竟是哪条规则决定了候选人 #1 是否被隐式删除?

    0 回复  |  直到 4 年前