Muss `gleichheit_vergleich_mit`` gemeinsame_referenz` erfordern?

12

Das Konzeptequality_­comparable_with<T, U> soll erklären, dass Objekte vom Typ Tund Umiteinander verglichen werden können, und wenn dies der Fall ist, hat dies die erwartete Bedeutung. Das ist gut.

Dieses Konzept muss common_reference_t<T&, U&>jedoch auch existieren. Der Hauptimpuls für common_referenceund die damit verbundene Funktionalität scheint darin zu bestehen, Proxy-Iteratoren zu ermöglichen , einen Platz zu haben, um die Beziehung zwischen referenceund value_typefür solche Iteratoren darzustellen .

Das ist großartig, aber ... was hat das mit dem Testen zu tun, ob a Tund a Ugleich miteinander verglichen werden können? Warum verlangt der Standard dies Tund Uhat eine gemeinsame Referenzbeziehung, damit Sie sie gleich vergleichen können?

Dies führt zu merkwürdigen Situationen, in denen es sehr schwierig ist, zwei Typen zu haben, die vernünftigerweise keine gemeinsame Referenzbeziehung haben, die logisch vergleichbar ist. Zum Beispiel vector<int>und sollte pmr::vector<int>logischerweise vergleichbar sein. Aber sie können nicht sein, weil es keinen vernünftigen gemeinsamen Bezug zwischen den beiden ansonsten nicht verwandten Typen gibt.

Nicol Bolas
quelle
@ Marshall würde diese Frage gutheißen.
Barry
Naja assignable_fromerfordert sogar common_reference...
cpplearner
@cpplearner: Das ist zumindest etwas sinnvoll, da die Zuweisung eine Eigenschaft ist, die Proxy-Referenzen und -Werte gemeinsam nutzen sollen.
Nicol Bolas

Antworten:

4

Dies geht bis zum Palo Alto-Bericht zurück , §3.3 und D.2.

Damit die typübergreifenden Konzepte mathematisch fundiert sind, müssen Sie definieren, was der typübergreifende Vergleich bedeutet. Für equality_comparable_with, im t == uAllgemeinen bedeutet , dass tund usind gleich, aber was macht es auch für zwei Werte verschiedenen Typen bedeutet gleich zu sein? Das Design besagt, dass typübergreifende Gleichheit definiert wird, indem sie dem allgemeinen (Referenz-) Typ zugeordnet werden (diese Konvertierung ist erforderlich, um den Wert beizubehalten).

Wenn die starken Axiome von equality_comparable_withnicht wünschenswert sind, verwendet der Standard das Nur-Exposition-Konzept weakly-equality-comparable-with, und dieses Konzept erfordert keine gemeinsame Referenz. Es ist jedoch ein "semantischer Gräuel" (in den Worten von Casey Carter) und ist nur aus diesem Grund eine Exposition: Es erlaubt das Haben t == uund t2 == uaber t != t2(dies ist tatsächlich für Sentinels notwendig).

TC
quelle
2
Das ist interessant, aber das erklärt nicht, warum die "mathematisch fundierte" Lösung diesen "allgemeinen Referenz" -Typ anstelle von ... nun, irgendetwas anderem beinhaltet . Das heißt, warum beinhaltet es dieses implizite Referenzkonvertierungsgeschäft anstelle von etwas, das logisch mathematisch fundierte Konzepte ermöglicht, die keine Konvertierungen zulassen (wie container<T, stuff>und container<U, other_stuff>vergleichbar sein, wenn Tes mit vergleichbar ist U)? Ist es nur das, common_referencewas verfügbar war, oder steckt mehr dahinter?
Nicol Bolas
Es fehlt die Idee, dass die Konvertierungsfunktion in den Typ common_reference ein Epimorphismus ist.
Oliv