`Equality_comparable_with` deve richiedere` common_reference`?


12

Il concetto ha loequality_­comparable_with<T, U> scopo di dichiarare che gli oggetti di tipo Te Upossono essere confrontati uguali tra loro, e se lo sono, allora questo ha il significato atteso. Va bene.

Tuttavia, questo concetto richiede anche common_reference_t<T&, U&>di esistere. L'impulso principale per common_referencee la sua funzionalità relativa sembra essere quello di consentire agli iteratori proxy , di avere un posto per rappresentare la relazione tra referencee value_typeper tali iteratori.

È fantastico, ma ... cosa c'entra con il test se a Te a Upossono essere confrontati uguali tra loro? Perché lo standard lo richiede Te Uha una relazione di riferimento comune solo per permetterti di confrontarli uguali?

Questo crea situazioni strane in cui è molto difficile avere due tipi che non hanno ragionevolmente una relazione di riferimento comune logicamente comparabili. Ad esempio, vector<int>e pmr::vector<int>logicamente dovrebbe essere comparabile. Ma non possono essere perché non esiste un ragionevole riferimento comune tra i due tipi altrimenti non correlati.


@ Marshall approverebbe questa domanda.
Barry,

Beh, assignable_fromrichiede anche common_reference...
cpplearner,

@cpplearner: questo ha almeno un po 'senso, dato che l'assegnazione è una proprietà che i riferimenti e i valori del proxy dovrebbero condividere.
Nicol Bolas,

Risposte:


4

Questo risale al rapporto Palo Alto , §3.3 e D.2.

Affinché i concetti di tipo incrociato siano matematicamente validi, è necessario definire il significato del confronto tra tipi. Per equality_comparable_with, t == ugeneralmente significa che te usono uguali, ma cosa significa anche per due valore di diversi tipi essere uguali? Il progetto afferma che l'uguaglianza tra i tipi viene definita mappandoli sul tipo comune (di riferimento) (questa conversione è necessaria per preservare il valore).

Laddove gli assiomi forti di equality_comparable_withnon sono desiderabili, lo standard usa il concetto di sola esposizione weakly-equality-comparable-withe quel concetto non richiede un riferimento comune. È, tuttavia, un "abominio semantico" (nelle parole di Casey Carter) ed è solo esposizione per quel motivo: permette di avere t == ue t2 == uma t != t2(questo è effettivamente necessario per le sentinelle).


2
È interessante, ma ciò non spiega perché la soluzione "matematicamente valida" implichi questo tipo di "riferimento comune" anziché ... beh, qualsiasi altra cosa . Cioè, perché implica fare questo implicito business di conversione di riferimento invece di qualcosa che consentirebbe concetti logicamente matematicamente validi che non possono permettere conversioni (come container<T, stuff>ed container<U, other_stuff>essere comparabili se Tparagonabili a U)? common_referenceEra solo quello che era disponibile o c'è di più?
Nicol Bolas,

Manca l'idea che la funzione di conversione nel tipo common_reference sia un epimorfismo.
Oliv
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.