Leere Funktion verstehen (A ())

8

Das ist mein Code

#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);
}

Was mich verwirrt hat ist, dass A()in void func(A())gleich A (*)()anstelle von A's Konstruktor ist. Wie funktioniert das?

Meisheng Shen
quelle
1
was bedeuten würde es , wenn A()war A‚s Konstruktor?
idclev 463035818
Alles, was als Funktionsdeklaration analysiert werden kann, ist eine Funktionsdeklaration. Suchen Sie nach "ärgerlichste Analyse" . Ich kann kein kanonisches Duplikat finden, aber viele ähnliche.
Richard Critten
@ Richard Most Vexing Parse
Adrian Mole
@ Adrian-ReinstateMonica Danke, ich habe das gefunden - da dieses Q so häufig ist, hoffte ich auf höhere Stimmen.
Richard Critten
@RichardCritten Ich bin mir nicht sicher, ob dies mit der nervigsten Analyse zusammenhängt, da dies speziell im Zusammenhang mit einer Funktionsdeklaration steht, bei der andere Analysen nicht (?) Anwenden konnten. Aber vielleicht irre ich mich?
Templatetypedef

Antworten:

9

Lassen Sie uns analog argumentieren. Wenn Sie eine Funktion definieren

void doSomething(A [137]) {

}

dann behandelt C ++ es so, als hätten Sie tatsächlich geschrieben

void doSomething(A *) {

}

Mit anderen Worten, es gibt einige Typen, bei denen C ++ sie automatisch durch einen anderen Typ ersetzt, wenn Sie sie als Parameter für eine Funktion verwenden, den Typ, den Sie durch Abklingen des Typs erhalten würden.

In Ihrem Fall, A() ist dies der Typ einer Funktion, die keine Argumente akzeptiert und eine zurückgibt A. Wenn Sie eine C ++ - Funktion haben, die ein A()als Argument verwendet, wird in C ++ stattdessen die Funktion als Eingabe verwendet A (*)(), ein Zeiger auf eine Funktion, die keine Argumente akzeptiert und ein zurückgibt A. Der Grund dafür ist, dass Sie A()in C ++ kein Objekt vom Typ haben können, obwohl Sie einen Zeiger auf ein Objekt haben können A().

templatetypedef
quelle