Zum Beispiel einer Erklärung, wie das:Warum erlaubt uns C++, den Variablennamen bei der Deklaration einer Variablen in Klammern zu setzen?
int (x) = 0;
Oder auch, dass:
int (((x))) = 0;
ich auf das, weil in meinem Code stolperte ich ein Fragment ähnlich den folgenden, einen haben passiert:
struct B
{
};
struct C
{
C (B *) {}
void f() {};
};
int main()
{
B *y;
C (y);
}
Offensichtlich wollte ich Objekt C
konstruieren, die dann etwas nützliches in seinem Destruktor tun würde. Wie dem auch sei, der Compiler behandelt C (y);
als eine Deklaration der Variablen y
mit dem Typ C
und gibt daher einen Fehler über y
Neudefinition aus. Interessante Sache ist, dass, wenn ich es als C (y).f()
oder als etwas wie C (static_cast<B*> (y))
schreibe, es wie beabsichtigt kompilieren wird. Die beste moderne Problemumgehung ist die Verwendung von {}
im Konstruktoraufruf natürlich.
So wie ich später herausgefunden, ist es möglich, Variablen wie int (x) = 0;
oder sogar int (((x))) = 0;
zu deklarieren, 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 jetzt sehe, dass es nur den Fall ähnlich dem berüchtigten "ärgerlichsten Parse" schafft und nichts nützliches hinzufügt?
Der "Zweck" der Möglichkeit ist wahrscheinlich, den Parser zu vereinfachen. – molbdnilo
mögliches Duplikat von [Was ist der Zweck einer Deklaration wie int (x); oder int (x) = 10;] (http://stackoverflow.com/questions/26832321/what-is-the-purpose-of-a-declaration-like-int-x-or-int-x-10) – GSerg
@GSerg Lustig, wie der Text meiner Frage auf die Frage von der zweiten Antwort in Ihrer verbundenen Frage antwortet, da ich das Beispiel zur Verfügung stelle, in dem das Erlauben solcher Deklarationen zu unerwarteten Ergebnissen führt :) – Predelnik