当前位置: 首页 > 知识库问答 >
问题:

为什么我可以用默认的而不能用用户提供的调用==?

谈萧迟
2023-03-14
#include <compare>

struct A
{
    int n;
    auto operator <=>(const A&) const noexcept = default;
};

struct B
{
    int n;
    auto operator <=>(const B& rhs) const noexcept
    {
        return n <=> rhs.n;
    }
};

int main()
{
    A{} == A{}; // ok
    B{} == B{}; // error: invalid operands to binary expression
}

用clang-10编译为clang-std=c++20-stdlib=libc++++main.cpp

共有1个答案

廖鸿达
2023-03-14

在宇宙飞船操作员的最初设计中,允许==调用<=>,但后来出于效率考虑不允许调用(<=>通常是实现==)的低效方法。操作符<=>()=default仍然被定义为隐式定义操作符==,为了方便起见,它正确地调用成员的==而不是<=>。所以你想要的是:

struct A {
    int n;
    auto operator<=>(const A& rhs) const noexcept = default;
};

// ^^^ basically expands to vvv

struct B {
    int n;
    bool operator==(const B& rhs) const noexcept
    {
        return n == rhs.n;
    }
    auto operator<=>(const B& rhs) const noexcept
    {
        return n <=> rhs.n;
    }
};

请注意,您可以独立地默认operator==,同时仍然提供用户定义的操作符<=>:

struct B {
    int n;
    // note: return type for defaulted equality comparison operator
    //       must be 'bool', not 'auto'
    bool operator==(const B& rhs) const noexcept = default;
    auto operator<=>(const B& rhs) const noexcept
    {
        return n <=> rhs.n;
    }
};
 类似资料:
  • 问题内容: 我不是从情节提要中使用a ,而是要有一个自定义函数,可以在其中传递某些对象的。我只想像在Objective- C中一样打电话。像这样: 但是我收到以下编译器错误: 必须调用超类UIViewController的指定初始化程序 我可以不再这样做吗? 问题答案: 对于指定的初始化器是。您应该打电话给它。 参见http://www.bignerdranch.com/blog/real-iph

  • 问题内容: 我有一个expressjs应用程序,在特定的路由上,我调用了一个函数,该函数通过使用数据库文档作为参数来响应数据库中的用户。我使用基于promise的库,并且想在将数据库文档放入响应中的回调内联。但是当我这样做时程序会失败。有人可以解释为什么吗?我还想知道为什么内联调用才能真正起作用。两种方法和之间有一些根本区别吗? 这是一个有效和无效的示例。假定返回用户文档的承诺。 问题答案: 像这

  • 问题内容: 我不应该能够调用实例化对象的私有方法。我想知道为什么下面的代码有效。 我知道可以从类中访问私有方法。但是,如果类中的方法实例化了同一类的对象,则作用域规则是否不适用于该实例化的对象? 如本例所示,像main这样的静态方法可以访问类的非静态成员吗​​? 问题答案: 您的方法是的方法,因此可以调用的私有方法。 只是因为它是一个方法并不妨碍它表现得像为目的的方法,等等。 只是阻止的方法 等

  • 我为我的Gridview调用了一个javascript,但它看起来像文档。所有这些在Chrome/Firefox中都不起作用。 我可以用什么来代替它?非常感谢。

  • 问题内容: 最近,我发现SQLAlchemy的Column默认值不起作用,因为我希望它能: 我想在对象实例化之后立即相等,但是似乎默认值仅在执行命令时使用,这确实使我感到困惑。为什么一个宁愿 过?以及如何实现我想要的?我应该在中指定所有默认参数吗?这似乎是代码重复:要更改默认值,我必须将其更改两次并保持这些值相等- 有什么办法可以避免这种情况? 问题答案: 您可以使用from的监听器来更改此行为: