Когда вы
A{"hello"} == "test2"
произведем разрешение перегрузки на operator==
. Во-первых, мы находим жизнеспособные кандидатов ([over.match.viable]), через поиск имен:
operator==(A const&, const char*); // yours
operator==(const char*, const char*); // built-in
Далее мы определяем, какой кандидат имеет лучшую неявное последовательность преобразования. Это первый тай-брейк в [over.match.best]:
Учитывая эти определения, жизнеспособный функция F1
определяется быть лучше функцией, чем другая жизнеспособной функция F2
, если для всех аргументов я, ИКС я (F1), не хуже, последовательность преобразования, чем ICS я (F2), а затем
(1.3) - для некоторого аргумента J, ИКС J (F1) является лучшей последовательностью преобразования, чем ICS J (F2), или, если не то, что [...]
Оба оператора являются Четк.совп на 2-й аргумент. По первому аргументу ваш operator==
- это точное соответствие, тогда как для встроенного пользователя требуется определенное пользователем преобразование. Точное совпадение - лучший вид конверсии, а определяемый пользователем худший - следовательно, у вас есть лучшая последовательность преобразования и становится лучшей жизнеспособной функцией.
В более общих терминах A
неявно преобразован в const char*
, потому что есть лучший вариант, где это не обязательно.
Когда вы делаете:
"test2" == A{"hello"};
Ваш кандидат не является жизнеспособным - нет неявного преобразования из const char*
в A const&
(первый аргумент), поэтому единственный реальный кандидатом является встроенным в сравнении для const char*
, для которого требуется пользовательское преобразование от A
до const char*
.
Если вы хотите, чтобы ваш A::operator==
был использован, то вам необходимо добавить новую перегрузку для operator==(const char*, A const&)
.
просто используйте std :: string – Davidbrcz
@Davidbrcz Это совсем не то, о чем этот вопрос. –
Я думал, что 'friend' делает функцию ** non ** - member (т. Е. Глобальную). –