O compilador funciona corretamente, de acordo com [over.match] e [conv] , mais especificamente [conv.fpint] e [conv.ptr].
Uma sequência de conversão padrão é [blá blá] zero ou uma [...] conversão integral flutuante, conversão de ponteiro, [...].
e
Um pré-valor de um tipo inteiro ou de um tipo de enumeração sem escopo pode ser convertido em um pré-valor de um tipo de ponto flutuante. O resultado é exato, se possível [blá blá]
e
Uma constante de ponteiro nulo é um literal inteiro com valor zero ou [...]. Uma constante de ponteiro nulo pode ser convertida em um tipo de ponteiro; o resultado é o valor de ponteiro nulo desse tipo [blá blá]
Agora, a resolução de sobrecarga é escolher a melhor correspondência entre todas as funções candidatas (que, como um recurso divertido, nem precisam ser acessíveis no local da chamada!). A melhor correspondência é aquela com parâmetros exatos ou, alternativamente, o menor número possível de conversões. Podem ocorrer zero ou uma conversão padrão (... para cada parâmetro) e zero é "melhor" que um.
(1-1)
é um literal inteiro com valor 0
.
Você pode converter o literal inteiro zero em cada um double
ou double*
(ou nullptr_t
), com exatamente uma conversão. Portanto, supondo que mais de uma dessas funções seja declarada (como é o caso no exemplo), existe mais de um candidato e todos os candidatos são igualmente bons, não existe melhor correspondência. É ambíguo, e o compilador tem razão em reclamar.
1-1
um literal inteiro ? É uma expressão que contém dois literais inteiros com valor1
e um-
operador.