Разрешение перегрузки C++, операторы преобразования и const
В данном случае
void f(int *);
void f(const int *);
...
int i;
f(&i);
Ситуация довольно ясна-f (int *) вызывается, что кажется правильным.
Однако, если у меня есть это (это было сделано так по ошибке (*)):
class aa
{
public:
operator bool() const;
operator char *();
};
void func(bool);
aa a;
func(a);
Вызывается оператор char * (). Я не могу понять, почему такой путь решения будет лучше, чем переход к оператору bool(). Есть идеи?
(*) Если const добавляется ко второму оператору, то код работает, как и ожидалось, конечно.
3 ответа:
Потому что для определяемых пользователем преобразований с оператором преобразования преобразование возвращаемого типа В тип назначения (т. е.
char*
вbool
) рассматриваетсяпосле преобразования аргумента объекта, т. е. преобразования аргумента объектаa
в неявный параметр объекта. [над.спичка.Лучший] / 1:С учетом этих определений жизнеспособная функция
F1
определяется как лучшая функция, чем другая жизнеспособная функцияF2
, Если для всех аргументов я, ICSя ... (F1
) не является ли последовательность преобразования хуже, чем ICSя ... (F2
), и тогда
Для некоторого аргумента j, ICSj(
F1
) является лучшей последовательностью преобразования, чем ICSj(F2
), или, если не это,Контекст является инициализацией путем преобразования, определенного пользователем (см. 8.5, 13.3.1.5 и 13.3.1.6) и стандартная последовательность преобразования от возвращаемого типа
F1
к целевому типу (т. е. инициализируемая сущность) является лучшей последовательностью преобразования, чем стандартная последовательность преобразования из тип возвратаF2
к типу назначения .Так как неявный параметр объекта, который является ссылка, не является
const
-ссылкой дляoperator char*
, это лучшее соответствие в соответствии с первым пунктом маркера.