Minor (poco importante) difetti nella norma?
Domanda
Questa domanda non ha problemi pratici connessi con esso, è più una questione di curiosità e di voler sapere se sto prendendo le cose troppo alla lettera;).
Così ho cercato di lavorare per capire come gran parte dello standard C ++ possibile. Oggi nel mio scavare nel standard I notato questo (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.
sembra abbastanza sano di mente a me. Ma poi ho pensato a me, aspetta un secondo qual è la definizione di data()
?.
const charT* data() const;
Yup, restituisce un const
charT*
.
Chiaramente la versione non-const di operator[]
non può essere implementato come un semplice return data()[pos]
allora poiché sarebbe l'inizializzazione di un riferimento di tipo char&
da un'espressione di tipo const char
.
Credo che sia ovvio che il intento è che data()
essere implementato qualcosa di simile return data_;
e operator[]
essere implementato come return data_[pos];
o qualcosa di funzionalmente simile, ma non è questo ciò che la norma dice :-P.
Se non ricordo male, implementatori avere qualche margine di manovra in quanto possono implementare le cose come loro piacimento, purché soddisfi i requisiti di base dati e ha lo stesso effetto netto.
Quindi la domanda è, sono io di essere via troppo letterale, o è questo il tipo di cosa che potrebbe essere considerato un difetto.
Modifica Vale la pena notare che il C ++ 0x progetto ha modificato la formulazione di:
Returns: If pos < size(), returns *(begin() + pos).
Otherwise, if pos == size(), the const version returns charT().
Otherwise, the behavior is undefined.
Quindi, forse ho solo inciampato su qualcosa che è già stato discusso.
Soluzione
Sì, è stato un difetto e sì, questa è stata la correzione.
http: //www.open- std.org/JTC1/SC22/WG21/docs/lwg-defects.html#259
Altri suggerimenti
Presumo che hanno usato data()
nella definizione invece di data_
perché volevano definire rigorosamente in termini di interfaccia pubblica.