Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, 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), на основании шаблонности во всяких разных позах и прочие.