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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top