Разрешение перегрузки 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 4

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

a является неконстантным экземпляром aa, поэтому неконстантный оператор преобразования является лучшим (точным) соответствием, чем const (требует добавления константы), хотя возвращаемые типы также не совпадают.

Ваш объект " aa " не является const, поэтому C++ предпочитает преобразование non-const.

Если вы делаете" aa " const, то будет использоваться оператор преобразования const bool ().