Поскольку оба преобразования эквивалентны, это неоднозначно. Помните, что язык C ++ напрямую определяет +
для аргументов double
и int
, стандартное преобразование не используется.
Так что ни одна из этих функций не лучше, чем другие:
double operator+ (double, int)
- требуется одно преобразование, определенное пользователем, и без стандартных преобразований
int operator+ (int, int)
- требуется одно преобразование, определенное пользователем, и без стандартных преобразований
Вам нужно будет самостоятельно предоставить все обычные арифметические операторы, если вы хотите, чтобы эта работа работала, и не полагаться на операторы неявного преобразования.
double operator+ (const MyClass&, int)
- требуется одно стандартное преобразование
int operator+ (const MyClass&, double)
- не требует преобразований
Теперь obj + 5
будет иметь однозначный лучший матч.
C ++ 0x черновик n3245 говорит, в разделе [over.built]
- В этом подпункте термин повышенный целочисленный тип используется для обозначения тех целочисленных типов, которые сохраняются целочисленным продвижением (включая, например,
int
и long
, но исключая, например, char
). Точно так же термин повышенный арифметический тип относится к плавающим типам плюс повышенные целочисленные типы.
Для каждой пары повышенных арифметических типов L и R существуют операторные функции-кандидаты вида
LR operator*(L, R);
LR operator/(L, R);
LR operator+(L, R);
LR operator-(L, R);
bool operator<(L, R);
bool operator>(L, R);
bool operator<=(L, R);
bool operator>=(L, R);
bool operator==(L, R);
bool operator!=(L, R);
, где LR
- результат обычных арифметических преобразований между типами L
и R
.