Este é o meu código
#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);
}
O que me confundiu é que A()
in void func(A())
é igual a A em (*)()
vez do A
construtor de. Como é que isso funciona?
A()
eraA
o construtor?Respostas:
Vamos raciocinar por analogia. Se você definir uma função
então C ++ trata como se você tivesse realmente escrito
Em outras palavras, existem alguns tipos em que, se você os usar como parâmetro para uma função, o C ++ os substituirá automaticamente por um tipo diferente, o tipo que você obteria ao decair o tipo.
No seu caso,
A()
é o tipo de função que não recebe argumentos e retorna umA
. Se você tiver uma função C ++ que aceita anA()
como argumento, o C ++ fará com que a função aceite como entrada anA (*)()
, um ponteiro para uma função que não aceita argumentos e retorna umA
. A razão para isso é que você não pode ter um objeto do tipoA()
em C ++, embora possa ter um ponteiro para umA()
.fonte