verdammt komischer Thread-Titel (was: verdammt komisches problem)
-
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.