Array-Fehler


  • Mod

    Arcoth schrieb:

    Ja, damit ist die Erweiterung weg. Warum werden leere Listen nicht erlaubt?

    Weil dafür keine Notwendigkeit besteht? Aggregate haben in C immer mindestens ein Element, das stellt dort daher keine Beschränkung dar. In C++ gibt es ja aber bekanntlich auch leere Klassen, und für die musste die Syntax entsprechend angepasst werden.


  • Mod

    camper schrieb:

    Arcoth schrieb:

    Ja, damit ist die Erweiterung weg. Warum werden leere Listen nicht erlaubt?

    Weil dafür keine Notwendigkeit besteht?

    Was, wenn ich ein Array einfach ausnullen will? Ist {0} etwa aussagekräftiger?


  • Mod

    In C++ gibt es ja aber bekanntlich auch leere Klassen, und für die musste die Syntax entsprechend angepasst werden.

    Wirklich? Leere Aggregate kann ich einfach per Zuweisung einer entsprechenden Temporary mit der effektiv gleichen Semantik initialisieren. Der triviale Default-Konstruktor existiert bei Aggregaten schließlich unbedingt. Und Ästhetik ist zwar ein Argument, aber bei leeren Aggregaten brauchen wir prinzipiell überhaupt keinen Initializer, denn wenn ich ausgenulltes Padding will, hätte ich einfach einen char -Member verpassen können und {0} verwenden, wie in C. So brauch' ich nicht einmal mehr Aliasing um das Byte zu lesen.

    Der Hauptgrund muss ein anderer gewesen sein; Ich tippe mal auf Ästhetik in Beispielen wie diesem:

    struct A {std::string s; /* … mehr Member… */ } a = {}; // (1)
    

    Um für (1) (in C++03) den gewünschten Effekt ohne leere Listen zu erzielen müsste ich entweder A einen Konstruktor verpassen, was eine ziemlich fragwürdige Option ist, da A so kein Aggregat mehr wäre - oder ich hau' die Initializer rein, was hässlich ist ( {std::string()} ) und zudem den Initializer Typ-Abhängig vom Member macht. (Wohlgemerkt, {""} hätte nicht die gleiche Semantik und könnte ineffizienter sein(?), ich hätte aber auch einen Typen nennen können der keine kurzen Initializer hat).

    In C++ ist ein Aggregat nämlich nicht zwangsläufig ein ausschließlich aus Aggregaten zusammengesetzter Typ, weswegen {0} auch nicht zwangsläufig funktioniert.


Anmelden zum Antworten