Warum erlaubt uns C ++, den Variablennamen beim Deklarieren einer Variablen in Klammern zu setzen?

Zum Beispiel eine Erklärung wie die folgende:

int (x) = 0;

Oder auch das:

int (((x))) = 0;

Ich bin darauf gestoßen, weil ich in meinem Code zufällig ein Fragment ähnlich dem folgenden hatte:

struct B
{
};

struct C
{
  C (B *) {}
  void f () {};
};

int main()
{
  B *y;
  C (y);
}

Offensichtlich wollte ich Objekt konstruierenC was dann etwas nützliches in seinem Destruktor machen würde. Wie auch immer, der Compiler behandeltC (y); als Deklaration der Variableny mit TypC und gibt somit einen Fehler über @ ay Neudefinition. Interessant ist, dass, wenn ich es als @ schreibC (y).f () oder als etwas wieC (static_cast<B*> (y)) es wird wie vorgesehen kompiliert. Die beste moderne Problemumgehung ist die Verwendung von{} im Konstruktoraufruf natürlich.

So wie ich später herausgefunden habe, ist es möglich Variablen wie @ zu deklarierint (x) = 0; oder auchint (((x))) = 0; aber ich habe noch nie jemanden gesehen, der Deklarationen wie diese verwendet. Also bin ich interessiert - was ist der Zweck einer solchen Möglichkeit, weil ich sehe, dass sie nur den Fall erzeugt, der dem berüchtigten "ärgerlichsten Parse" ähnelt, und nichts Nützliches hinzufügt?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage