c++ - resueltos - ¿Por qué puedo asignar una referencia de función a una variable de puntero de función anónima?
punteros c++ pdf (1)
Es muy probable que esté relacionado con este error reportado por Zack Weinberg:
Error 68265 - Se acepta silenciosamente un disparateo sintáctico arbitrario después de ''int (*) {}'' hasta la próxima llave de cierre
(De ¿ Por qué este código de aspecto no válido se compila correctamente en g ++ 6.0? :)
El compilador de C ++ no puede diagnosticar construcciones mal formadas, como
int main() { int (*) {} any amount of syntactic nonsense on multiple lines, with *punctuation* and ++operators++ even... will be silently discarded until the next close brace }
Con -pedantic -std = c ++ 98 se obtiene "advertencia: las listas de inicialización extendidas solo están disponibles con -std = c ++ 11 o -std = gnu ++ 11", pero con -std = c ++ 11, no un peep
Si se elimina alguno (o más) de los tokens ''int (*) {}'', aparece un error. Además, el compilador de C no tiene el mismo error.
Por supuesto, si intenta int (*) (int, int) {}
u otras variantes, se compila erróneamente. Lo interesante es que la diferencia entre esto y los informes de errores / duplicados anteriores es que int (*) (int, int) = asdf
requiere que asdf
sea un nombre en el alcance. Pero dudo mucho que los errores sean de naturaleza diferente, ya que el problema principal es que GCC le permite omitir un declarator-id .
[n4567 §7 / 8]: "Cada init-declarator en el init-declarator-list contiene exactamente un declarator-id , que es el nombre declarado por ese init-declarator y por lo tanto uno de los nombres declarados por la declaración".
Aquí hay una rareza:
int (*) (int, int) = main;
En este escenario específico, GCC no se queja de tomar la dirección de main (como matrices, &main
es equivalente a main
).
El siguiente código compila bien y no estoy seguro de por qué. ¿Puede alguien explicarme por qué esto es legal?
Estoy usando g ++ (Debian 6.1.1-10) 6.1.1 20160724 para compilar.
#include <iostream>
int sum(int x, int y) { return x + y; }
int main(int argc, char *argv[])
{
using std::cout;
int (*) (int, int) = ∑
cout << "what" << ''/n'';
}
Apéndice
El siguiente programa compila bien usando g ++ versión 5.4.0 pero no compila en gcc.
int main()
{
int (*) = 20;
}