`Equality_comparable_with` için“ common_reference ”gerekir mi?


12

Kavramequality_­comparable_with<T, U> türü bu nesnelerin bildirmek için tasarlanmıştır Tve Ubirbirine eşit karşılaştırılabilir, ve eğer, bu beklenen anlama sahiptir. Bu iyi.

Ancak, bu kavramın da var olması gerekir common_reference_t<T&, U&>. İçin birincil itici güç common_referenceve onun işlevselliği , proxy yineleyicilerinin etkinleştirilmesi , bu yineleyiciler arasındaki referenceve value_typebu yineleyiciler arasındaki ilişkiyi temsil edecek bir yeri olması gibi görünmektedir .

Bu harika, ama ... a Tve Ua'nın birbiriyle eşit olup olmadığını test etmekle ne ilgisi var ? Standart neden bunu eşitlemenizi sağlamak için bunu gerektirir Tve Uortak bir referans ilişkisine sahiptir?

Bu, mantıklı olarak karşılaştırılabilir ortak referans ilişkisine sahip olmayan iki türün bulunmasının çok zor olduğu garip bir durum yaratır. Örneğin, vector<int>ve pmr::vector<int>mantıksal olarak benzer olması gerekir. Ancak bunun nedeni, birbiriyle alakasız iki tür arasında makul bir ortak referans olmamasıdır.


@Marshall bu soruyu onaylar.
Barry

Hatta assignable_fromgerektirir common_reference...
cpplearner

@cpplearner: Atama, proxy başvurularının ve değerlerinin paylaşması beklenen bir özellik olduğundan, en azından biraz mantıklı.
Nicol Bolas

Yanıtlar:


4

Bu, Palo Alto'nun §3.3 ve D.2 raporuna kadar uzanıyor.

Çapraz tip kavramlarının matematiksel olarak sağlam olması için çapraz tip karşılaştırmasının ne anlama geldiğini tanımlamanız gerekir. İçin equality_comparable_with, t == ugenellikle araçlarının tve ueşit, ama o bile eşit olması farklı türde iki değeri için ne anlama geliyor? Tasarım, çapraz tip eşitliğinin, ortak (referans) tipe eşleştirilmesiyle tanımlandığını söylüyor (bu dönüşüm değeri korumak için gereklidir).

Güçlü aksiyomlarının equality_comparable_withistenmediği durumlarda, standart sadece anlatım konseptini kullanır weakly-equality-comparable-withve bu kavram ortak bir referans gerektirmez. Bununla birlikte, bu bir "semantik iğrençlik" tir (Casey Carter'ın sözleriyle) ve sadece bu nedenle açıklamadır: sahip olmasına izin verir t == uve t2 == uancak t != t2(bu aslında nöbetçiler için gereklidir).


2
Bu ilginç, ama bu "matematiksel olarak sağlam" çözümün neden başka bir şey yerine bu "ortak referans" türünü içerdiğini açıklamıyor . Bu yüzden o (gibi yerine dönüşümleri izin veremeyiz mantıksal matematiksel ses konseptler için izin verecek bir şeyin bu örtük referans dönüşüm iş yapma içeriyor olduğu container<T, stuff>ve container<U, other_stuff>eğer olmak karşılaştırılabilir Tkarşılaştırılabilir U)? Sadece common_referencemevcut muydu, yoksa bundan daha fazlası var mı?
Nicol Bolas

Common_reference türüne dönüştürme işlevinin bir epimorfizm olduğu fikrinden yoksundur.
Oliv
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.