On 2017-11-11 ISO C ++ komitesi kabul Herb Sutter için önerisini <=> 'uzay gemisi' üç yönlü karşılaştırma operatörü eklendi yeni özelliklerinden biri olarak 20 C ++ . Kağıt başlıklı yılında Tutarlı karşılaştırma Sutter, Maurer ve Kahverengi yeni tasarım kavramlarını göstermektedir. Teklife genel bir bakış için makaleden bir alıntı:
Sentezleme b <=> getirileri karşılaştırır bir amacı <0 ise <b , karşılaştırır > 0 ise , bir> b ve karşılaştırır == 0 a ve b, aynı / eşit ise.
Yaygın durum: X türünüzle ilgili tüm karşılaştırmaları Y türüyle , üye semantiklerle yazmak için şunu yazın:
auto X::operator<=>(const Y&) =default;
Gelişmiş vaka: senin tipin tüm karşılaştırmaları yazmak için X tipi ile Y sadece yazma, operatör <=> bir alan Y kullanabilirsiniz
= varsayılan istenirse memberwise anlambilim almak ve döner uygun kategori türü:
- Bir İade _ordering senin tipin doğal destekliyorsa < ve biz verimli simetrik elde edersiniz < , > , <= , > = , == ve
! = ; aksi takdirde _ eşitliği döndürdüğünüzde etkin bir şekilde simetrik == ve ! = üreteceğiz .
- İade strong_ senin tipin için eğer a == b ima f (a) == f (b) (ikame edilebilirlik, f kamu kullanılarak erişilebilen tek karşılaştırma-belirgin halini okur const üye), aksi dönmek
weak_ .
Karşılaştırma Kategorileri
Beş karşılaştırma kategorisi std::, her biri aşağıdaki önceden tanımlanmış değerlere sahip olan türler olarak tanımlanır:
+--------------------------------------------------------------------+
| | Numeric values | Non-numeric |
| Category +-----------------------------------+ |
| | -1 | 0 | +1 | values |
+------------------+------+------------+---------------+-------------+
| strong_ordering | less | equal | greater | |
| weak_ordering | less | equivalent | greater | |
| partial_ordering | less | equivalent | greater | unordered |
| strong_equality | | equal | nonequal | |
| weak_equality | | equivalent | nonequivalent | |
+------------------+------+------------+---------------+-------------+
Bu türler arasındaki örtük dönüşümler aşağıdaki gibi tanımlanır:
strong_orderingdeğerlerle { less, equal, greater} örtülü dönüşür:
weak_orderingdeğerlerle { less, equivalent, greater}
partial_orderingdeğerlerle { less, equivalent, greater}
strong_equalitydeğerlerle { unequal, equal, unequal}
weak_equalitydeğerlerle { nonequivalent, equivalent, nonequivalent}
weak_orderingdeğerlerle { less, equivalent, greater} örtülü dönüşür:
partial_orderingdeğerlerle { less, equivalent, greater}
weak_equalitydeğerlerle { nonequivalent, equivalent, nonequivalent}
partial_orderingdeğerlerle { less, equivalent, greater, unordered} örtülü dönüşür:
weak_equalitydeğerlerle { nonequivalent, equivalent, nonequivalent, nonequivalent}
strong_equalitydeğerlerle { equal, unequal} dolaylı olarak şuna dönüştürülür:
weak_equalitydeğerlerle { equivalent, nonequivalent}
Üç yönlü karşılaştırma
<=>Belirteci ilave edilir. Karakter dizisi eski kaynak kodunda <=>tokenlenir <= >. Örneğin, X<&Y::operator<=>anlamını korumak için bir boşluk eklemesi gerekir.
Yüklenebilir operatör <=>üç yönlü bir karşılaştırma işlevidir ve önceliği daha yüksek <ve daha düşüktür <<. Değişmez değerlerle karşılaştırılabilecek bir tür döndürür, 0ancak ifade şablonlarını destekleme gibi diğer döndürme türlerine izin verilir. <=>Dilde ve standart kütüphanede tanımlanan tüm işleçler, yukarıda belirtilen 5 std::karşılaştırma kategorisi türünden birini döndürür .
Dil türleri için aşağıdaki yerleşik <=>aynı tür karşılaştırmalar sağlanır. Aksi belirtilmedikçe, hepsi sınırlıdır . Bu karşılaştırmalar skaler promosyonlar / dönüşümler kullanılarak heterojen olarak başlatılamaz.
- İçin
bool, integral ve işaretçi türleri, <=>geri dönüş strong_ordering.
- İşaretçi türleri için, farklı cv-nitelikleri ve türetilmiş-baz dönüşümlerinin homojen bir yerleşik çağrılmasına izin verilir
<=>ve yerleşik heterojen vardır operator<=>(T*, nullptr_t). Sadece aynı nesneye / tahsise işaretçilerin karşılaştırılması sabit ifadelerdir.
- Temel kayan nokta türleri için,
<=>döndürür partial_orderingve daha büyük bir kayan nokta türüne argümanlar genişletilerek heterojen olarak çağrılabilir.
- Numaralandırmalar
<=>için numaralandırmanın altında yatan türle aynı döndürür <=>.
- Çünkü
nullptr_t, <=>geri döner strong_orderingve daima verim verir equal.
- Kopyalanabilir diziler için, 's ile
T[N] <=> T[N]aynı türü döndürür ve lexicographic elementwise karşılaştırması yapar. Başka diziler için de yok .T<=><=>
- Çünkü
voidyok <=>.
Bu operatörün iç işleyişini daha iyi anlamak için lütfen orijinal belgeyi okuyun . Bu sadece arama motorlarını kullanarak öğrendim.