N
Kellerautomat schrieb:
Wie bereits gesagt wurde, kann man auch size() als freie Funktion bauen.
Natürlich kann man sich alles bauen. Der Punkt ist, dass dies mit std::array schon da ist.
Wie viele Leute schreiben sich size() selbst? Genau niemand. Ist es nicht vorhanden, wird es nicht benutzt. Lieber nimmt man Nachteile in Kauf, " sizeof funktioniert ja auch".
Kellerautomat schrieb:
sizeof x / sizeof *x finde ich gar nicht mal schlimm, wenn man es nur einmal braucht.
Alleine schon weil es ebenso mit Zeigern "funktioniert", ist es gefährlich.
Kellerautomat schrieb:
Die "Debugmoeglichkeiten" habe ich lustigerweise noch nie vermisst bei rohen Arrays. Ich bin es mittlerweile schon gewohnt, wegen der folgenden Aussage als Troll bezeichnet zu werden, aber ich kann mich tatsaechlich nicht erinnern, wann ich das letze mal ueber Arraygrenzen hinause versucht habe zu schreiben. Muss wohl schon einige Jahre her sein.
Ja, solche Fehler passieren fast nie. Falls sie aber doch einmal passieren, ist man unheimlich froh, solche Sicherheitsmechanismen zu haben.
Kellerautomat schrieb:
Niemand benutzt gerne Dinge, die umstaendlich sind. "Umstaendlich" liegt nur im Auge des Betrachters. Ich finde einen zusaetzlichen Include und die ganze zusaetzlichen zeichen umstaendlich.
Ja, man muss Prioritäten setzen. Die Vor- und Nachteile von std::array stehen aber in keinem Verhältnis zu einander.
Kellerautomat schrieb:
Daher meine Frage: Wie oft will man sowas wirklich? Ich benutze Arrays hauptsaechlich fuer statische Daten, die will ich gar nicht kopieren. Was macht ihr denn mit Arrays?
Wenn man ein Array komplexer initialisieren will, kann man sich dafür eine Funktion schreiben, die ein gefülltes std::array zurückgibt.
Kellerautomat schrieb:
array-to-pointer decay finde ich praktisch. Zwar nicht unbedingt optimal geloest (eine Art .ptr wie in D faende ich da besser), aber praktisch. Wieso ist das eine Fehlerquelle?
Jede implizite Konvertierung ist eine potenzielle Fehlerquelle. In diesem Fall z.B., weil eine falsche Überladung aufgerufen werden könnte. Du hast sicher schon gesehen, dass Leute versucht haben, Arrays mittels cout << array auszugeben. Du hast weder einen Fehler zur Kompilier- noch zur Laufzeit, sondern einen Bug im Code. Mit std::array hätte sowas gar nicht erst kompiliert.
Kellerautomat schrieb:
Diese Erfahrung habe ich (leider?) noch nicht gemacht.
Einmal reicht, und du hast eine Lektion fürs Leben
Kellerautomat schrieb:
Dass man das mit Iteratoren macht, ist schon klar. Da haben rohe Arrays aber auch keine Nachteile, daher bin ich auf die Uebergabe eines Arrays eingegangen.
Doch, haben sie. Erstens musst du den end() -Iterator komplizierter berechnen, zweitens hast du keine Checked Iterators.