Haruskah operator <=> mensintesis perbandingan array?
Saya telah bermain dengan implementasi saya sendiri dari std :: array dan melihat versi libc ++ menggunakan operator yang didefinisikan secara eksplisit untuk setiap perbandingan (==,! =, <,>, <=,> =). Saya pikir saya bisa menyederhanakan kode saya dengan menerapkan operator pesawat ruang angkasa C ++ 20 (<=>). Namun, ketika saya mengganti operator perbandingan non-anggota dengan auto operator<=>(const Array<TYPE,SIZE>&) const = default;dalam tubuh struct, batang GCC menunjukkan bahwa fungsi itu "dihapus secara implisit karena definisi default akan berbentuk buruk". Beberapa investigasi menunjukkan bahwa anggota array mentah adalah pelakunya.
Halaman web ini menunjukkan bahwa, "Kompilator mengetahui cara memperluas anggota kelas yang merupakan array ke dalam daftar sub-objek mereka dan membandingkannya secara rekursif." Dan jawaban SO ini menunjukkan bahwa hanya array yang dapat disalin yang berpartisipasi dalam sintesis perbandingan.
Karena penasaran, saya menjalankan kode dari tautan pertama di Compiler Explorer. Itu juga gagal untuk dikompilasi di trunk gcc . Namun, clang trunk berhasil mengompilasi kode.
Jadi, pertanyaan saya adalah: kompiler mana yang benar? Haruskah perbandingan disintesis untuk array anggota atau tidak?
Jawaban
Haruskah operator <=> mensintesis perbandingan array?
Iya. Inilah yang dikatakan standar (draf kerja akhir):
[class.compare.default]
Fungsi operator pembanding default (12.6.2) untuk beberapa kelas C harus menjadi ...
Subobjek kelas dasar langsung dari C ... diikuti oleh anggota data non-statis C, dalam urutan deklarasi mereka dalam spesifikasi-anggota dari formulir daftar sub objek. Dalam daftar itu, setiap subobjek berjenis array diperluas secara rekursif ke urutan elemennya, dalam urutan subskrip yang bertambah. Misalkan xi adalah nilai l yang menunjukkan elemen ke-i dalam daftar subobjek yang diperluas untuk sebuah objek x (dengan panjang n), di mana xi dibentuk oleh urutan konversi turunan-ke-basis (12.4.3.1), ekspresi akses anggota kelas ( 7.6.1.4), dan ekspresi subskrip array (7.6.1.1) diterapkan ke x.