В этом случае
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 добавляется ко второму оператору, конечно, код работает как положено.
Потому что для пользовательских преобразований с оператором преобразования преобразование возвращаемого типа в тип назначения (т.е. 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*
Это лучшее совпадение по первому пункту.
a
неконстантный экземпляр aa
таким образом, оператор неконстантного преобразования является лучшим (точным) соответствием, чем оператор const (требует добавления константности), даже если возвращаемые типы также не совпадают.
Ваш объект «aa» не является константным, поэтому C ++ предпочитает неконстантное преобразование.
Если вы сделаете «aa» const, то будет использован оператор преобразования const bool ().