Minor (unwichtig) Defekt in der Norm?
Frage
Diese Frage hat keine praktischen Probleme mit ihm verbunden ist, es ist mehr eine Frage der Neugier und wollen wissen, ob ich die Dinge zu wörtlich nehme;).
So habe ich zum Verständnis, wie viel von dem C ++ Standard wie möglich zu arbeiten versucht. Heute in meinem Delving in den Standard Ich habe bemerkt, diese (ISO / IEC 14882: 2003 21.3.4):
const_reference operator[](size_type pos) const;
reference operator[](size_type pos);
Returns: If pos < size(), returns data()[pos].
Otherwise, if pos == size(), the const version returns charT().
Otherwise, the behavior is undefined.
Scheint ziemlich vernünftig zu mir. Aber dann dachte ich mir, eine Sekunde warten, was ist die Definition von data()
?.
const charT* data() const;
yup, es gibt ein const
charT*
.
Klar, dass die nicht-const-Version von operator[]
kann nicht als einfaches return data()[pos]
implementiert wird dann da dies eine Referenz vom Typ char&
aus einem Ausdruck des Typ const char
wird initialisiert wird.
Ich denke, dass es offensichtlich ist, dass die Absicht ist, dass data()
etwas wie return data_;
und operator[]
als return data_[pos];
oder etwas funktionell ähnlich umgesetzt wird umgesetzt werden, aber das ist nicht das, was der Standard sagt :-P.
Wenn ich mich richtig erinnere, Implementierer haben eine gewissen Spielraum, dass sie die Dinge umsetzen können, wie sie so lange bitte, wie es die Grundvoraussetzungen erfüllt gegeben und hat den gleichen Netto-Effekt.
Die Frage ist also, bin ich sein Weg zu wörtlich, oder ist dies die Art von Sache, die als Fehler angesehen werden würde.
EDIT: Es ist erwähnenswert, dass der c ++ 0x Entwurf die Formulierung geändert hat:
Returns: If pos < size(), returns *(begin() + pos).
Otherwise, if pos == size(), the const version returns charT().
Otherwise, the behavior is undefined.
Also vielleicht habe ich stolperte auf etwas, das bereits diskutiert worden ist.
Lösung
Ja, es war ein Fehler, und ja, das war die Lösung.
http: //www.open- std.org/JTC1/SC22/WG21/docs/lwg-defects.html#259
Andere Tipps
Ich gehe davon aus, dass sie data()
in der Definition statt data_
verwendet, weil sie wollten, in Bezug auf die öffentliche Schnittstelle streng definieren, in.