Este es mi codigo
#include <iostream>
class A {
public:
int a = 0;
A(int i = 0) : a(i) {}
};
void func(A())
{
std::cout << "Hello" << std::endl;
}
int main()
{
A(*p)() = NULL;
func(p);
}
Lo que me confundió es que A()
en void func(A())
es igual a A en (*)()
lugar del A
constructor. ¿Como funciona esto?
A()
fueA
el constructor?Respuestas:
Razonemos por analogía. Si define una función
entonces C ++ lo trata como si realmente hubieras escrito
En otras palabras, hay algunos tipos donde, si los usa como parámetro de una función, C ++ los reemplazará automáticamente con un tipo diferente, el tipo que obtendría al descomponer el tipo.
En su caso,
A()
es el tipo de función que no toma argumentos y devuelve unA
. Si tiene una función C ++ que toma unA()
como argumento, C ++ tendrá la función tomar como entrada anA (*)()
, un puntero a una función que no toma argumentos y devuelve unA
. La razón de esto es que no puede tener un objeto de tipoA()
en C ++, aunque puede tener un puntero a unA()
.fuente