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_ordering
değerlerle { less
, equal
, greater
} örtülü dönüşür:
weak_ordering
değerlerle { less
, equivalent
, greater
}
partial_ordering
değerlerle { less
, equivalent
, greater
}
strong_equality
değerlerle { unequal
, equal
, unequal
}
weak_equality
değerlerle { nonequivalent
, equivalent
, nonequivalent
}
weak_ordering
değerlerle { less
, equivalent
, greater
} örtülü dönüşür:
partial_ordering
değerlerle { less
, equivalent
, greater
}
weak_equality
değerlerle { nonequivalent
, equivalent
, nonequivalent
}
partial_ordering
değerlerle { less
, equivalent
, greater
, unordered
} örtülü dönüşür:
weak_equality
değerlerle { nonequivalent
, equivalent
, nonequivalent
, nonequivalent
}
strong_equality
değerlerle { equal
, unequal
} dolaylı olarak şuna dönüştürülür:
weak_equality
değ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, 0
ancak 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_ordering
ve 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_ordering
ve 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ü
void
yok <=>
.
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.