Was ist der Zweck einer Deklaration wie int (x); oder int (x) = 10;
Wenn man sich die Grammatik für *declarator*s in §8/4
Sie werden bemerken, dass noptr-declarator
kann geschrieben werden als (ptr-declarator
), das heißt, es kann geschrieben werden als (declarator-id
), die überprüft, Erklärungen wie diejenigen, die in dem Titel. Als eine Angelegenheit von der Tat dieser code kompiliert werden, ohne ein problem:
#include <iostream>
struct A{ int i;};
int (x) = 100;
A (a) = {2};
int main()
{
std::cout << x << '\n';
std::cout << a.i << '\n';
}
Aber was ist der Zweck, dass diese Klammern, wenn ein Zeiger auf ein array oder eine Funktion) ist nicht beteiligt an der Erklärung?
- Vermutlich, weil zu verbieten, Ihnen würde erfordern eine komplexere Grammatik.
- Das mag eine Erklärung sein. Ich glaube nicht, über diese.
- Ebenso
(42)
ist ein Gültiger Ausdruck, obwohl die Klammern sind unnötig.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Tatsache, dass diese Regel gilt, in Ihrem Fall ist nicht beabsichtigt: Es ist letztendlich ein Ergebnis zu halten, die Grammatik einfach. Es gibt keinen Anreiz zu untersagen, Erklärungen wie die Eure, aber es gibt große Hindernisse zu erschweren, Regeln, vor allem wenn die kompliziert, wie Sie sind.
Kurz gesagt, wenn Sie nicht möchten, verwenden Sie diese unnötig verschleiert-syntax nicht.
C++ nur selten zwingt Sie das verfassen lesbarer code.
Überraschend gibt es Szenarien, in denen die Klammern können den Tag retten, obwohl:
friend std::string (::foo)();
Erklärung? Was haben wir eigentlich erklären, und warum?foo
erklärt wird in der ersten Zeile einfriend
des structBar
. Deklarieren eine Funktion zum Freund, die Sie brauchen, zu geben, der Rückgabetyp und Argumente. Aber zu sagenfriend std::string foo()
wird nicht funktionieren, da für unqualifizierte verwenden, dassfoo
verborgen ist, von 'einem anderen'foo
. So muss man sich qualifizierenfoo
durch die weltweite qualifier::
. Aber das gibt die erste form angezeigt, die leidet an Unklarheit mit der Bezeichnung von (nicht-existent), Mitgliedstd::string
. Ein paar von Klammern::foo
dient der Vermeidung der MehrdeutigkeitDu hast die falsche Frage gestellt. Die richtige Frage ist:
Die Antwort ist: es gibt keine.
So, da diese syntax ist zulässig, da eine Nebenwirkung von Regeln anderswo, das ist, was Sie bekommen.
T(x);
ist die Deklaration einer Variablenx
TypT
eher als eine funktionelle cast-Ausdruck vonx
zu gebenT
(rein für seine Nebenwirkungen), das ist, wie es aussieht.