Considere o seguinte código.
void f(double p) {}
void f(double* p) {}
int main()
{ f(1-1); return 0; }
O MSVC 2017 não compila isso. Parece que há uma chamada sobrecarregada ambígua, como 1-1
é a mesma 0
e, portanto, pode ser convertida double*
. Outros truques, como 0x0
, 0L
, ou static_cast<int>(0)
, não quer trabalhar. Mesmo declarando a const int Zero = 0
e chamando f(Zero)
produz o mesmo erro. Só funciona corretamente se Zero
não estiver const
.
Parece que o mesmo problema se aplica ao GCC 5 e abaixo, mas não ao GCC 6. Estou curioso para saber se isso faz parte do padrão C ++, um bug conhecido do MSVC ou uma configuração no compilador. Um Google superficial não produziu resultados.
fonte
1-1
um literal inteiro ? É uma expressão que contém dois literais inteiros com valor1
e um-
operador.-1
). O qual, como o tipo padrão é assinado , no entanto, é obviamente necessário, e é comprovadamente possível (e universalmente aceito) também.1-1
. C ++ não possui literais inteiros negativos.-1
é uma expressão composta por um1
literal inteiro (do tipo assinado) e um-
operador menos unário. Consulte também a seção "Notas" em cppreference.com .u
, seu literal é, por definição, assinado. Os tipos assinados têm valores negativos (cerca de 50% dos valores possíveis são negativos). É lamentável que a gramática (por uma razão que eu não saberia) seja enganosa dessa maneira e, embora tecnicamente (de acordo com a gramática) -1 seja um literal positivo, negado, por todos os outros meios, é claro que é negativo literal. Muito parecido com 3 + 4 é literal.0U
. Mesmo problema. O que eu não tentei é umenum
valor. Talvez um nomeado tivesse mudado as coisas. Acabei escrevendo uma longa expressão comdecltype
eremove_reference
.