Re[4]: перегрузки с приоритетами
От: vopl Россия  
Дата: 01.07.23 09:00
Оценка: +1
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, vopl, Вы писали:


К>>>Если бы мы могли измерить вес подстановки, как это делает компилятор (точное попадание, cv, decay, шаблон, приведение типа — ну вот это вот всё), то можно было бы как-то наколхозить приоритеты и руками диспетчеризовывать.

К>>>Можем ли?

V>>А там нет "веса".. Если вкратце/поверхностно — рассматривается конвертация одного аргумента->параметр, каждая конвертация относительно другой меряется как "лучшая/худшая", далее все эти конвертации сбиваются в кучу чтобы выйти на функцию в целом, функции так же выстраиваются в отношение, но немного другое -"лучшая/нелучшая". Далее на основании этого отношения уже выбирается перегрузка. Неоднозначность возникает когда наверху образуется пара "нелучших".. Тут детали https://timsong-cpp.github.io/cppwp/over.match.best


К>Вот эти лучшая-нелучшая по каждому аргументу независимо и образуют вес ICS_i (13 уровней — они там в параграфах 2.1 — 2.13 перечислены, "or, if not that").


К>Над двумя векторами весов ICS задаётся частичный порядок: если все элементы одного лучше-или равны всех элементов другого, и хотя бы один строго лучше — весь вектор считается строго лучше — выбираем эту перегрузку.


Ну, немножко наоборот, сначала перегрузки оцениваются во векторам ICS (https://timsong-cpp.github.io/cppwp/over.match.best#general-1.sentence-2) и если в результате не находится "лучшей" — применяются те 13 пунктов (https://timsong-cpp.github.io/cppwp/over.match.best#general-2). А в них уже некоторое количество всяких специальных случаев выбора, например на основе возвращаемого типа (в случае user defined conversion, reference binding), на основании шаблонности во всяких разных позах и прочие.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.