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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top