sirven resueltos que punteros para los funciones ejercicios ejemplos ejemplo dev declaracion con apuntadores c++ language-lawyer

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) = &sum; 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; }