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-1
es lo mismo 0
y, por lo tanto, se puede convertir double*
. Otros trucos, como 0x0
, 0L
o static_cast<int>(0)
, tampoco funcionan. Incluso declarar ay const int Zero = 0
llamar f(Zero)
produce el mismo error. Solo funciona correctamente si Zero
no 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-1
un entero literal ? Es una expresión que contiene dos literales enteros con valor1
y 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.-1
es una expresión compuesta por un1
literal 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 unenum
valor. Tal vez un nombre hubiera cambiado las cosas. Terminé escribiendo una larga expresión condecltype
yremove_reference
.