【问题标题】:Should operator<=> synthesize array comparisons?operator<=> 应该合成数组比较吗?
【发布时间】:2021-01-16 06:18:33
【问题描述】:

我一直在玩自己的 std::array 实现,并注意到 libc++ 的版本对每个比较使用明确定义的运算符(==、!=、、=)。我想我可以通过实现 C++20 的宇宙飞船运算符 () 来简化我的代码。但是,当我在结构体中用auto operator&lt;=&gt;(const Array&lt;TYPE,SIZE&gt;&amp;) const = default; 替换非成员比较运算符时,GCC 主干表明该函数“被隐式删除,因为默认定义格式不正确”。一些调查表明,原始数组成员是罪魁祸首。

This webpage 表示,“编译器知道如何将数组类的成员扩展为它们的子对象列表并递归地比较它们。”而this SO answer表示只有可复制数组参与比较合成。

出于好奇,我从 Compiler Explorer 上的第一个链接运行代码。 It also fails to compile on gcc trunk。但是,clang trunk compiles the code successfully.

所以,我的问题是:哪个编译器是正确的?是否应该为成员数组综合比较?

【问题讨论】:

  • 这是gcc bug 93480
  • 另外,数组类型的可复制性也不相关。您可以默认比较不可复制数组。只有可比性是相关的。

标签: c++ arrays c++20 comparison-operators


【解决方案1】:

运算符是否应该综合数组比较?

是的。这就是标准(最终工作草案)所说的:

[class.compare.default]

某个 C 类的默认比较运算符函数 (12.6.2) 应为 ...

C 的直接基类子对象 ... 后跟 C 的非静态数据成员,按照它们在成员规范中的声明顺序形成子对象列表。在该列表中,任何数组类型的子对象都递归地扩展为其元素的序列,按下标递增的顺序。设 xi 是一个左值,表示对象 x(长度为 n)的子对象扩展列表中的第 i 个元素,其中 xi 由一系列派生到基转换 (12.4.3.1)、类成员访问表达式 ( 7.6.1.4),以及应用于 x 的数组下标表达式 (7.6.1.1)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    • 2022-01-13
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    相关资源
    最近更新 更多