Das Konzeptequality_comparable_with<T, U>
soll erklären, dass Objekte vom Typ T
und U
miteinander 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_reference
und die damit verbundene Funktionalität scheint darin zu bestehen, Proxy-Iteratoren zu ermöglichen , einen Platz zu haben, um die Beziehung zwischen reference
und value_type
für solche Iteratoren darzustellen .
Das ist großartig, aber ... was hat das mit dem Testen zu tun, ob a T
und a U
gleich miteinander verglichen werden können? Warum verlangt der Standard dies T
und U
hat 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.
quelle
assignable_from
erfordert sogarcommon_reference
...Antworten:
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
, imt == u
Allgemeinen bedeutet , dasst
undu
sind 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_with
nicht wünschenswert sind, verwendet der Standard das Nur-Exposition-Konzeptweakly-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 Habent == u
undt2 == u
abert != t2
(dies ist tatsächlich für Sentinels notwendig).quelle
container<T, stuff>
undcontainer<U, other_stuff>
vergleichbar sein, wennT
es mit vergleichbar istU
)? Ist es nur das,common_reference
was verfügbar war, oder steckt mehr dahinter?