【发布时间】:2021-01-16 06:18:33
【问题描述】:
我一直在玩自己的 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.
所以,我的问题是:哪个编译器是正确的?是否应该为成员数组综合比较?
【问题讨论】:
-
另外,数组类型的可复制性也不相关。您可以默认比较不可复制数组。只有可比性是相关的。
标签: c++ arrays c++20 comparison-operators