Struct mit Base beim Anlegen mit Initialisierungsliste?
-
Hi!
Ist es wirklich nicht möglich, eine struct mit base beim Anlegen mit der Initialisierungsliste zu initialisieren?
struct Base { int val; }; struct Der : public Base { int val2; }; Der der = { 1, 2 }; // error C2552: non-aggregates cannot be initialized with initializer listWarum ist das so?

-
Weil Der kein Aggregat ist.
-
Ja schon, aber was steckt dahinter?
Wo ist das Problem für den Compiler, 'Der' als eine struct wie auch jede andere ohne base aufzufassen?
Ich sehe das wieder mal als unnötige Restriktion...
-
Solche Klassen sind nicht mehr C kompatibel und es sind eine menge Spezialfälle (virtuelle Vererbung/private Member) zu beachten). Nicht zuletzt existieren für die Initialiserung solcher Objekte Konstruktoren, hier eine Aggregatinitialisierung einzuführen würde die Sprache weiter verkomplizieren, weil sich das unmittelbar auf die Definition der Lebensdauer von Objekten auswirkt.
Entweder wurde ein solches Feature nie hinreichend nachdrücklich gefordert oder aber aus wichtigen Gründen abgelehnt. Persönlich würde ich so einen Vorschlag auch ablehnen, solange der Nutzen nicht demonstriert wird (ein bisschen nützlich reicht nicht aus).
-
Na gut, dann nicht.
Danke und MfG
-
Initiat0r schrieb:
Na gut, dann nicht.
Danke und MfGSpricht etwas gegen Konstruktoren? Die Aggregat-Initialisierungsliste für PODs ist in C++ ohnehin nicht allzu verbreitet.
-
Es ist halt einfacher.
-
Im ersten Moment bestimmt, wenn man nur ein wenig Beispielcode schreibt. Aber wo braucht man das denn wirklich? - Wohl eher selten, dass man die benötigten Daten (bis auf Dummy Werte) im Code so drin stehen hat.
Und wenn es dich fest stört, dann kannst du ja immer noch eine Funktion definieren, die dir ein solches struct übernimmt und dir dann das konstruierte Objekt zurückgibt. (in der Funktion machst du dann genau das, was du sonst halt machen müsstest). So hättest du auch deine bequeme Initialisierung.