Разрешение перегрузки 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*, это лучшее соответствие в соответствии с первым пунктом маркера.