перегрузка — разрешение перегрузки 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 добавляется ко второму оператору, конечно, код работает как положено.

4

Решение

Потому что для пользовательских преобразований с оператором преобразования преобразование возвращаемого типа в тип назначения (т.е. char* в bool) Считается после преобразование аргумента объекта, то есть преобразование аргумента объекта a к неявному параметру объекта. [Over.match.best] / 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*Это лучшее совпадение по первому пункту.

3

Другие решения

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

1

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

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

0
По вопросам рекламы [email protected]