xml*_*lmx 7 c++ comparison standards spaceship-operator c++20
#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
}
Run Code Online (Sandbox Code Playgroud)
用 clang-10 编译为 clang -std=c++20 -stdlib=libc++ main.cpp
为什么A{} == A{}有效但无效B{} == B{}?
在飞船运营商的最初设计中,==允许调用<=>,但后来由于效率问题而被禁止(<=>通常是一种低效的实现方式==)。 operator<=>() = default仍然定义为隐式定义,为方便起见operator==,它正确调用==而不是<=>成员。所以你想要的是这个:
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;
}
};
Run Code Online (Sandbox Code Playgroud)
请注意,您可以独立默认,operator==同时仍提供用户定义的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;
}
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
159 次 |
| 最近记录: |