Чи потрібна `рівність_порівнянний_з`, вимагає "загальної_посилання"?


12

Концепціяequality_­comparable_with<T, U> покликана заявити , що об'єкти типу Tі Uможуть бути порівняні рівні один одному, і якщо вони є, то це має очікуваний сенс. Це добре.

Однак це поняття також вимагає common_reference_t<T&, U&>існування. Основним поштовхом до common_referenceта його супутньої функціональності, здається, є можливість ввімкнути проксі-ітератори , мати місце для представлення зв’язку між такими ітераторами referenceта value_typeдля них.

Це чудово, але ... що це стосується тестування, якщо a Tі a Uможна порівняти рівними один одному? Чому цей стандарт вимагає цього Tі Uмає загальні довідкові відносини лише для того, щоб можна порівняти їх рівними?

Це створює дивні ситуації, коли дуже важко мати два типи, які розумно не мають загальноприйнятого відношення, що є логічно порівнянними. Наприклад, vector<int>і pmr::vector<int>логічно повинно бути порівнянним. Але вони не можуть бути, тому що немає розумних загальних посилань між двома інакше неспорідненими типами.


@Marshall схвалив це питання.
Баррі

Ну навіть assignable_fromвимагає common_reference...
cpplearner

@cpplearner: Це хоча б дещо має сенс, оскільки присвоєння є властивістю, яким очікується спільне використання проксі-посилань та значень.
Нікол Болас

Відповіді:


4

Це повний шлях до звіту Пало-Альто , §3.3 та D.2.

Щоб поняття перехресного типу були математично обгрунтованими, потрібно визначити, що означає порівняння міжхресного типу. Для equality_comparable_with, як t == uправило , означає , що tі uрівні, але що це взагалі значить для двох цінностей різних типів бути рівні? Конструкція говорить, що рівність крос-типу визначається шляхом відображення їх до загального (еталонного) типу (це перетворення потрібно для збереження значення).

Там, де сильні аксіоми equality_comparable_withне бажані, стандарт використовує концепцію weakly-equality-comparable-with, що стосується лише експозиції , і ця концепція не потребує загального посилання. Однак, це "смислова гидота" (за висловом Кейсі Картера) і є лише експозицією з цієї причини: вона дозволяє мати t == uі t2 == uале t != t2(це насправді необхідно для дозорних).


2
Це цікаво, але це не пояснює, чому рішення "математично обгрунтоване" передбачає цей тип "загальної посилання" замість ... ну, нічого іншого . Тобто, навіщо це робити цей неявний бізнес-конверсійний бізнес, а не те, що дозволило б мати логічно обгрунтовані поняття, які не можуть дозволити перетворення (наприклад, container<T, stuff>і container<U, other_stuff>бути порівнянним, якщо Tпорівняти U)? Це просто common_referenceбуло доступно, або є більше, ніж це?
Нікол Болас

Не вистачає ідеї, що функція перетворення у тип common_reference є епіморфізмом.
Олів
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.