gpt4 book ai didi

c++ - 为什么默认的三向运算符 (spaceship <=>) 生成相等运算符 (==) 而用户定义的三向运算符不生成?

转载 作者:行者123 更新时间:2023-12-04 16:40:43 26 4
gpt4 key购买 nike

考虑这个代码:

#include <iostream>
#include <compare>

class A {
public:
int i = {};

std::strong_ordering operator<=> (A const& r) const
{
return i <=> r.i;
}
};

void TestA()
{
A a;
A b;

std::cout<< (a<b);
std::cout<< (a>b);
std::cout<< (a<=b);
std::cout<< (a>=b);
//std::cout<< (a==b); //ERROR
std::cout << 'E';
//std::cout<< (a!=b); //ERROR
std::cout << 'E';
std::cout<< std::is_eq(a<=>b);
std::cout<< std::is_neq(a<=>b) << std::endl;
}

class B {
public:
int i = {};

std::strong_ordering operator<=> (B const& r) const = default;

};


void TestB()
{
B a;
B b;

std::cout<< (a<b);
std::cout<< (a>b);
std::cout<< (a<=b);
std::cout<< (a>=b);
std::cout<< (a==b);
std::cout<< (a!=b);
std::cout<< std::is_eq(a<=>b);
std::cout<< std::is_neq(a<=>b) << std::endl;
}

class C {
public:
bool b = {};
int v1 = {};
int v2 = {};

std::strong_ordering operator<=> (C const& r) const
{
return (b?v1:v2) <=> (r.b?r.v1:r.v2);
}

bool operator== (C const& r) const
{
return std::is_eq(*this<=>r);
}

};

void TestC()
{
C a;
C b;

std::cout<< (a<b);
std::cout<< (a>b);
std::cout<< (a<=b);
std::cout<< (a>=b);
std::cout<< (a==b);
std::cout<< (a!=b);
std::cout<< std::is_eq(a<=>b);
std::cout<< std::is_neq(a<=>b) << std::endl;
}


int main()
{
TestA();
TestB();
TestC();

return 0;
}

https://wandbox.org/permlink/SLmLZOc18RaJV7Mu

删除注释以获取错误。

首先我想问一下为什么默认的三向运算符的行为与用户定义的运算符不同?

其次,对于类(class) C,这个问题的解决方案是否正确?还是应该以不同的方式处理?

这只是一个简单的例子,我有更复杂的情况,有数十个字段和 union (如果你不明白我的意思,请查看一些英特尔 API ;))。

编辑:

这个问题 Equality operator does not get defined for a custom spaceship operator implementation in C++20专注于为什么用户定义的三向运算符没有默认的相等运算符,我想知道为什么默认和用户定义的行为存在差异?

编辑2:

我稍微修改了类 C在示例中描绘更多现实生活中的问题(当默认运算符不是有效解决方案时)。我还想澄清一下,我想知道这些差异背后的原因(用户定义和默认运算符之间),以便能够评估我的现实生活中的解决方案是否正确(类似于 C),因为我确实重视更多的代码可维护性比我现在正在工作的一部分代码的性能。

最佳答案

principle reason为什么相等和排序分开是性能。如果您有一个类型的排序操作是用户定义的,那么通常情况下,您可以编写一个用户定义的相等测试操作,它在执行相等测试时更有效。因此,该语言应该鼓励您不要使用 operator<=> 来编写它。用于直接相等性测试。

这仅适用于用户定义的排序/相等操作。默认排序是按成员排序的,默认相等操作也是按成员排序的。并且由于排序意味着相等,因此默认排序也默认相等是合理的。

是的,他们可以让人们拼写出来,但是 there wasn't really a good reason for that . operator<=>旨在使选择默认排序变得容易;让你为其中一个已经暗示的东西写两个声明是没有意义的。

关于c++ - 为什么默认的三向运算符 (spaceship <=>) 生成相等运算符 (==) 而用户定义的三向运算符不生成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61488372/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com