Zum Beispiel eine Erklärung wie die folgende:
int (x) = 0;
Oder sogar das:
int (((x))) = 0;
Ich bin darauf gestoßen, weil ich in meinem Code zufällig ein Fragment hatte, das dem folgenden ähnlich ist:
struct B
{
};
struct C
{
C (B *) {}
void f () {};
};
int main()
{
B *y;
C (y);
}
Offensichtlich wollte ich ein Objekt konstruieren, C
das dann etwas Nützliches in seinem Destruktor tun würde. In diesem Fall wird der Compiler jedoch C (y);
als Deklaration einer Variablen y
mit Typ behandelt C
und gibt daher einen Fehler bezüglich der y
Neudefinition aus. Interessant ist, dass wenn ich es so C (y).f ()
oder so schreibe, es C (static_cast<B*> (y))
wie beabsichtigt kompiliert wird. Die beste moderne Problemumgehung ist {}
natürlich die Verwendung im Konstruktoraufruf.
Wie ich später herausgefunden habe, ist es möglich, Variablen wie int (x) = 0;
oder sogar zu deklarieren, int (((x))) = 0;
aber ich habe noch nie jemanden gesehen, der solche Deklarationen tatsächlich verwendet. Ich bin also interessiert - was ist der Zweck einer solchen Möglichkeit, weil ich im Moment sehe, dass sie nur den Fall schafft, der der berüchtigten "ärgerlichsten Analyse" ähnelt und nichts Nützliches hinzufügt?
quelle
Antworten:
Gruppierung.
Beachten Sie als besonderes Beispiel, dass Sie eine Variable vom Funktionstyp deklarieren können, z
Wie würden Sie nun einen Zeiger auf so etwas deklarieren?
Nein, funktioniert nicht! Dies wird als Rückgabe einer Funktion interpretiert
int*
. Sie müssen die Klammern hinzufügen, damit sie richtig analysiert werden:Das gleiche gilt für Arrays:
quelle
()
in einem Typ gearbeitet wird, ist im gesamten Typ einheitlich.In solchen Deklarationen dürfen im Allgemeinen Klammern verwendet werden, da die Deklaration aus syntaktischer Sicht immer so aussieht:
Zum Beispiel in der folgenden Erklärung:
Der "Fronttyp" ist
int
(nichtint*
) und die "Spezifikation" ist* p[2]
.Die Regel ist, dass Sie im Teil "Spezifikation" eine beliebige Anzahl von Klammern verwenden können, da diese manchmal nicht eindeutig zu unterscheiden sind. Beispielsweise:
Der Zeiger auf ein Array ist ein seltener Fall, jedoch die gleiche Situation wie bei einem Zeiger auf die Funktion:
Dies ist die direkte Antwort auf Ihre Frage. Wenn Ihre Frage über die Aussage wie ist
C(y)
, dann:(C(y))
und Sie erhalten, was Sie wolltenquelle
{}
ist doch die gültigste.<front-type> <specification>
ist irreführend und falsch. Die Grammatik ist<declaration-specifier> <declarator>
<declaration-specifier>
auch durchauto
Schlüsselwörter gespielt werden , so dass es nicht immer ein Typ ist.