Considere el siguiente código.
void f(double p) {}
void f(double* p) {}
int main()
{ f(1-1); return 0; }
MSVC 2017 no compila eso. Se da cuenta de que hay una llamada sobrecargada ambigua, ya que 1-1es lo mismo 0y, por lo tanto, se puede convertir double*. Otros trucos, como 0x0, 0Lo static_cast<int>(0), tampoco funcionan. Incluso declarar ay const int Zero = 0llamar f(Zero)produce el mismo error. Solo funciona correctamente si Zerono es así const.
Parece que el mismo problema se aplica a GCC 5 e inferior, pero no a GCC 6. Tengo curiosidad por saber si esto es parte del estándar C ++, un error conocido de MSVC o una configuración en el compilador. Un Google superficial no dio resultados.
fuente

1-1un entero literal ? Es una expresión que contiene dos literales enteros con valor1y un-operador.-1). Lo cual, dado que el tipo predeterminado está firmado , sin embargo, es obviamente necesario, y es demostrablemente posible (y universalmente aceptado) también.1-1. C ++ no tiene literales enteros negativos.-1es una expresión compuesta por un1literal entero (de tipo con signo) y un-operador menos unario. Consulte también la sección "Notas" en cppreference.com .u, tu literal está, por definición, firmado. Los tipos firmados tienen valores negativos (aproximadamente el 50% de los valores posibles son negativos). Es desafortunado que la gramática (por una razón que no sabría) sea engañosa de esta manera, y aunque técnicamente (según la gramática) -1 es un literal positivo, negado, por todos los demás medios es, por supuesto, negativo. literal. Al igual que 3 + 4 es un literal.0U. Mismo problema. Lo que no probé es unenumvalor. Tal vez un nombre hubiera cambiado las cosas. Terminé escribiendo una larga expresión condecltypeyremove_reference.