La mayoría de los programadores de C++ como me han hecho el siguiente error en algún momento:¿Hay algún uso para declaraciones de funciones locales?
class C { /*...*/ };
int main() {
C c(); // declares a function c taking no arguments returning a C,
// not, as intended by most, an object c of type C initialized
// using the default constructor.
c.foo(); // compiler complains here.
//...
}
Ahora bien, aunque el error es bastante obvio una vez que sepa que me preguntaba si hay algún uso razonable para este tipo de declaración de función local excepto que puede hacerlo, especialmente dado que no hay manera de definir tal función local en el mismo bloque; tienes que definirlo en otro lugar.
Creo que las clases locales de estilo Java son una característica bastante agradable que tiendo a usar a menudo, especialmente el tipo anónimo. Incluso las clases locales de C++ (que pueden tener funciones miembro definidas en línea) tienen algún uso. Pero esta declaración de función local sin definición me parece muy incómoda. ¿Es solo un C-legacy o hay algún caso de uso más profundo del que no tengo conocimiento?
Editar para los no creyentes: C c()
es no una declaración de puntero de función.
Este programa
int main()
{
void g();
cout << "Hello ";
g();
return 0;
}
void g()
{
cout << "world." << endl;
}
salidas Hello world.
Este programa
void fun()
{
cout << "world." << endl;
}
int main()
{
void g();
g = fun;
cout << "Hello ";
g();
return 0;
}
no compila. gcc se queja:
error: cannot convert 'void()()' to 'void()()' in assignment
Comeau:
error: expression must be a modifiable lvalue
Tenga en cuenta que el mensaje de error GCC es incorrecto (error conocido). Debería emitir "error: no se puede convertir 'void()' en 'void()' en la asignación" pero realmente exige incorrectamente el ID de tipo. (en lugar de "void()()", que sería una función que devuelve una función (tipo ilegal), debería decir "void()") –
pregunta relacionada: http://stackoverflow.com/questions/928992/nested -functions-are-not-allowed-but-why-nested-function-prototypes-are-allowed –
No estoy seguro de que el mensaje de error gcc sea un error; de hecho, puede declarar la función con un par adicional de paréntesis ' void (g)() ', que necesita cuando se trata de punteros a funciones:' void * g() 'es una función que devuelve' void * ', mientras que' void (* g)() 'es un puntero a una función de tipo, bueno, 'void()()', es decir, no toma argumentos y no devuelve nada. – Tobias