verdammt komischer Thread-Titel (was: verdammt komisches problem)
-
warum crasht das erste und das zweite funktioniert?
Das erste funktioniert nicht, weil std::string kein POD ist und nicht mit 0 initialisiert werden kann.
Das zweite funktioniert, weil in C++ nur der erste Member mit 0 initialisiert wird mit {0}.
Simon
Edit: Benutze doch einfach Konstruktoren um dein Typ zu initialisieren. BTW. in C++ ist struct und cass (ausser der Default Sichtbarkeit der Member) identisch.
-
std::string hat einen Konstruktor, der char* als Parameter hat. Nullzeiger sind bei diesem allerdings nicht zulässig.
-
theta schrieb:
weil in C++ nur der erste Member mit 0 initialisiert wird mit {0}.
Das stimmt doch nicht?!
{ 0 } initialisiert alles mit Null. { } genau so.
struct ST { int i; int j; std::string s; }; ST st = { 0 };Jetzt ist 'st.j' auch garantiert Null-Initialisiert.
Aber wenn ein std::string dabei ist, müsste der ja auch mit 0 initialisiert werden. Ist das Compilerabhängig, und der erkennt, ob es sich um einen elementaren Datentyp handelt, und initialisiert dann halt nur diese?
-
Einspruch schrieb:
theta schrieb:
weil in C++ nur der erste Member mit 0 initialisiert wird mit {0}.
Das stimmt doch nicht?!
Ja, könnte sein, dass das nicht stimmt.
Simon
-
und zu was ratet ihr mir jetzt? wie kann ich die struct jetzt leer zuweisen, um sicher zu gehen, dass nicht noch was drinsteht?
danke - anooony
-
Mach ein Konstruktor. Dort ist der Platz für Initialisierung.
Simon
-
Ein std::string ist von Anfang an leer, den brauchst du nicht initialisieren.
Wenn du gemischte Typen hast, versuche die Klammer leer zu lassen, also { }, und keine Null reinzuschreiben.
Scheint compilerabhängig zu sein, in Visual Studio crasht dann nichts mit zB. std::string und int.Und es heißt int main(), nicht long main(). Die Parameterliste kannst du dir außerdem sparen, wenn du sie nicht brauchst.
-
danke - habs jezt über den construktor gemacht. danke auch für die zusätzlichen tips.
gurß - anooony
-
@camper: bist du sicher dass das laut Std. überhaupt mit {} initialisiert werden darf?
Ist {} nicht nur für Aggregates erlaubt? Und ist es für Aggregates nicht verboten Member zu haben die einen ctor haben?
-
Übrigens ein verdammt komischer Thread-Titel...
-
hustbaer schrieb:
@camper: bist du sicher dass das laut Std. überhaupt mit {} initialisiert werden darf?
Ist {} nicht nur für Aggregates erlaubt? Und ist es für Aggregates nicht verboten Member zu haben die einen ctor haben?Dazu habe ich mich hier bisher gar nicht geäußert. Allerdings
zu 1. -8.5.1/8 ... An empty initializer-list can be used to initialize any aggregate.
Das ist nur in C++ möglich. In C muss immer wenigstens ein Initialisierer angegeben werden, daher die ominöse allgegenwärtige 0 (die hier in C++ allerdings auch mal zum Problem wird).
zu 2. Die Restriktion, keinen ctor zu haben, ist nicht rekursiv zu verstehen. Man denke einfach mal an Arrays aus Klassen. Die Member eines Aggregates müssen nicht selbst Aggregat sein.