Compreendendo a função void (A ())

8

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 Aconstrutor de. Como é que isso funciona?

meisheng shen
fonte
1
o que significaria quando A()era Ao construtor?
Idclev 463035818
Qualquer coisa que possa ser analisada como uma declaração de função é uma declaração de função. Procure a "análise mais irritante" . Não é possível encontrar uma duplicata canônica, mas muitas similares.
Richard Critten 28/11/19
@Richard Most Vexing Parse
Adrian Mole
@ Adrian-ReinstateMonica Obrigado, achei esse - porque esse Q é tão comum estava esperando votos mais altos.
Richard Critten 28/11/19
@RichardCritten Não tenho certeza se isso está relacionado ao Most Vexing Parse, pois isso é especificamente no contexto de uma declaração de função em que outros analisadores não poderiam (?) Se aplicar. Mas talvez eu esteja enganado?
templatetypedef

Respostas:

9

Vamos raciocinar por analogia. Se você definir uma função

void doSomething(A [137]) {

}

então C ++ trata como se você tivesse realmente escrito

void doSomething(A *) {

}

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 um A. Se você tiver uma função C ++ que aceita an A()como argumento, o C ++ fará com que a função aceite como entrada an A (*)(), um ponteiro para uma função que não aceita argumentos e retorna um A. A razão para isso é que você não pode ter um objeto do tipo A()em C ++, embora possa ter um ponteiro para um A().

templatetypedef
fonte