$ 13.3.1.5 / 2 состояния- "Рассматриваются функции преобразования S и его базовых классов. Те, которые не скрыты в S и дают тип T или тип, который можно преобразовать в тип T через стандартпоследовательность преобразования (13.3.3.1.1) является функциями-кандидатами. Считается, что функции преобразования, которые возвращают cv-квалифицированный тип, дают неквалифицированную cv версию этого типа для этого процесса выбора функций-кандидатов. Функции преобразования, которые возвращают «ссылку на cv2»X »возвращает lvalues типа« cv2 X »и, следовательно, считается, что дает X для этого процесса выбора функций-кандидатов."
Назначение s = t работает следующим образом:
a) Рассматриваются все члены типа 't' (testClass), которые могут преобразовать 't' в 's'.
Candidate 1: operator string(); // s created using member string::operator=(string const&)
Candidate 2: operator char *() // s created using member string::operator=(char const*)
Candidate 3: operator char *() // s created using member string::operator=(char *)
b) Все вышеперечисленные кандидаты являются жизнеспособными (то есть вПри отсутствии других кандидатов компилятор может успешно разрешить вызов функции для любого из них)
c) Однако теперь лучше всего черезНужный кандидат должен быть определен.Используемые последовательности преобразования:
Candidate 1: U1 : operator string()
Candidate 2: U2 : operator char*()->const qualification to match string::operator=(char const*)
Candidate 3: U3 : operator char*()
$ 13.3.3.1.1 / 3 состояния - «Ранг последовательности преобразования определяется с учетом ранга каждого преобразования в последовательности и рангалюбая ссылочная привязка (13.3.3.1.4). Если любой из них имеет ранг конверсии, последовательность имеет ранг конверсии; "
Это означает, что все U1, U2 и U3 имеют ранг конверсии и впервый уровень не лучше другого.Однако в стандарте также указывается
Пользовательская последовательность преобразования U1 является лучшей последовательностью преобразования, чем другая пользовательская последовательность преобразования U2, если они содержат одну и ту же пользовательскую функцию преобразования или конструктор, и если втораястандартная последовательность преобразования U1 лучше, чем вторая стандартная последовательность преобразования U2.
Итак, давайте посмотрим, что это значит.
Между U1 и U2, они включают в себя различные функции преобразованияи, следовательно, ни один не лучше, чем другой
Между U1 и U3, они включают в себя различные функции преобразования, и, следовательно, ни один не лучше, чем другие
Так что насчет U1 и U2.Они включают в себя одну и ту же функцию преобразования, которая удовлетворяет первой части условия «и» выше
Так что насчет части », и если вторая стандартная последовательность преобразования U1 лучше, чем вторая стандартная последовательность преобразования U2. "
В U2 вторая стандартная последовательность преобразования требует квалификации const, тогда как в U3 это не требуется.Второй стандартной последовательностью преобразования U3 является точное совпадение.
Но, как указано в таблице 9 в стандартных состояниях, квалификация CV также считается точным соответствием.
Следовательно, U2 и U3 такжедействительно неразличимо с точки зрения разрешения перегрузки.
Это означает, что все U1, U2 и U3 действительно так же хороши, как и друг друга, и компилятор считает, что разрешение вызова (как часть оператора присваивания) является неоднозначным, посколькуне однозначно лучшее жизнеспособная функция