如何解决运算符<=>是否应该合成数组比较?
我一直在使用自己的std :: array实现,并且注意到libc ++的版本对每个比较(==,!=,, =)使用显式定义的运算符。我认为可以通过实现C ++ 20的太空船运算符()来简化代码。但是,当我在结构体中将非成员比较运算符替换为auto operator<=>(const Array<TYPE,SIZE>&) const = default;
时,GCC主干指示该函数“被隐式删除,因为默认定义会格式错误”。一些调查表明,原始数组成员是罪魁祸首。
This webpage表示:“编译器知道如何将作为数组的类的成员扩展到其子对象列表中,并进行递归比较。” this SO answer表示只有可复制的数组参与比较合成。
出于好奇,我从Compiler Explorer的第一个链接运行了代码。 It also fails to compile on gcc trunk。但是,clang trunk compiles the code successfully.
所以,我的问题是:哪个编译器正确?比较是否应该针对成员数组进行合成?
解决方法
运算符应该合成数组比较吗?
是的。这就是标准(最终工作草案)所说的:
[class.compare.default]
某些C类的默认比较运算符函数(12.6.2)应该是...
C ...的直接基类子对象,后跟C的非静态数据成员,按照它们在成员规范的声明中的顺序形成子对象列表。在该列表中,数组类型的任何子对象都以递增下标的顺序递归扩展到其元素的序列。令xi为一个左值,表示对象x(长度为n)的子对象扩展列表中的第ith个元素,其中xi由一系列派生到基转换(12.4.3.1),类成员访问表达式( 7.6.1.4),并将数组下标表达式(7.6.1.1)应用于x。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。