El compilador funciona correctamente, de acuerdo con [over.match] y [conv] , más específicamente [conv.fpint] y [conv.ptr].
Una secuencia de conversión estándar es [bla, bla] Cero o una [...] conversión integral flotante, conversión de puntero, [...].
y
Un prvalue de un tipo entero o de un tipo de enumeración sin ámbito se puede convertir en un prvalue de un tipo de punto flotante. El resultado es exacto si es posible [bla bla]
y
Una constante de puntero nulo es un literal entero con valor cero o [...]. Una constante de puntero nulo se puede convertir a un tipo de puntero; el resultado es el valor de puntero nulo de ese tipo [bla, bla, bla]
Ahora, la resolución de sobrecarga es elegir la mejor combinación entre todas las funciones candidatas (que, como una característica divertida, ¡ni siquiera tiene que estar accesible en la ubicación de la llamada!). La mejor coincidencia es la que tiene parámetros exactos o, alternativamente, la menor cantidad posible de conversiones. Pueden ocurrir cero o una conversión estándar (... para cada parámetro), y cero es "mejor" que uno.
(1-1)
es un entero literal con valor 0
.
Puede convertir el literal entero cero a cada uno de los dos double
o double*
(o nullptr_t
), con exactamente una conversión. Entonces, suponiendo que se declare más de una de estas funciones (como es el caso en el ejemplo), existe más de un solo candidato, y todos los candidatos son igualmente buenos, no existe la mejor coincidencia. Es ambiguo, y el compilador tiene razón al quejarse.
1-1
un entero literal ? Es una expresión que contiene dos literales enteros con valor1
y un-
operador.