Comprensión del vacío (A ())

8

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 Aconstructor. ¿Como funciona esto?

meisheng shen
fuente
1
¿Qué significaría cuando A()fue Ael constructor?
idclev 463035818
Cualquier cosa que pueda analizarse como una declaración de función es una declaración de función. Busque "el análisis más irritante" . No se puede encontrar un duplicado canónico, pero muchos similares.
Richard Critten
@Richard Most Vexing Parse
Adrian Mole
@ Adrian-ReinstateMonica Gracias, encontré esa, ya que esta Q es tan común esperaba obtener más votos.
Richard Critten
@RichardCritten No estoy seguro de que esto esté relacionado con el análisis más irritante, ya que esto es específicamente en el contexto de una declaración de función donde otros análisis no podrían aplicarse (?). Pero tal vez estoy equivocado?
templatetypedef

Respuestas:

9

Razonemos por analogía. Si define una función

void doSomething(A [137]) {

}

entonces C ++ lo trata como si realmente hubieras escrito

void doSomething(A *) {

}

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 un A. Si tiene una función C ++ que toma un A()como argumento, C ++ tendrá la función tomar como entrada an A (*)(), un puntero a una función que no toma argumentos y devuelve un A. La razón de esto es que no puede tener un objeto de tipo A()en C ++, aunque puede tener un puntero a un A().

templatetypedef
fuente