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?