Domanda È male dipendere dall'indice 0 di uno std :: string vuoto?


std::string my_string = "";
char test = my_string[0];

Ho notato che questo non si blocca e ogni volta che lo ho testato, il test è 0.

Posso dipendere dal fatto che sia sempre 0? o è arbitrario?

Questa cattiva programmazione?

Modificare: Da alcuni commenti, deduco che c'è qualche incomprensione sull'utilità di questo.

Lo scopo di questo NON è controllare per vedere se la stringa è vuota. Non è necessario controllare se la stringa è vuota.

La situazione è che c'è una stringa che può o non può essere vuota. Mi interessa solo il primo carattere di questa stringa (se non è vuota).

Mi sembra, sarebbe meno efficiente controllare se la stringa è vuota, e quindi, se non è vuota, guarda il primo carattere.

if (! my_string.empty())
    test = my_string[0];
else
    test = 0;

Invece, posso solo guardare il primo carattere senza dover controllare se la stringa è vuota.

test = my_string[0];

44
2017-10-12 14:06


origine


risposte:


C ++ 14

No; puoi fare affidamento su di esso.

In 21.4.5.2 (o [string.access]) possiamo trovare:

Ritorna: *(begin() + pos) Se pos < size(). In caso contrario, restituisce un riferimento a un oggetto di tipo charT con valore charT(), dove la modifica dell'oggetto porta a un comportamento non definito.

In altre parole, quando pos == size() (che è vero quando entrambi sono 0), l'operatore restituirà un riferimento a a default-costruito tipo di personaggio a cui è vietato modificare.

Non è speciale per le stringhe vuote (o di dimensioni 0) e funziona allo stesso modo per ogni lunghezza.


C ++ 03

E più probabilmente C ++ 98 pure.

Dipende.

Ecco 21.3.4.1 dalla ISO / IEC 14882 ufficiale:

Resi: se pos < size(), ritorna data()[pos]. Altrimenti, se pos == size(), la versione const restituisce charT(). Altrimenti, il comportamento non è definito.


67
2017-10-12 14:12



@Bartek Banachewicz's risposta spiega quali circostanze ti permettono di fare la tua ipotesi. Vorrei aggiungere questo

questa è una cattiva programmazione.

Perché? Per diverse ragioni:

  1. Devi essere un avvocato linguistico solo per essere sicuro che questo non sia un bug. Non saprei la risposta se non fosse per questa pagina, e francamente - non penso che dovresti preoccuparti di saperlo.
  2. Le persone senza l'intuizione di una stringa che è una sequenza di caratteri con terminazione nulle non hanno idea di cosa stai cercando di fare fino a quando non leggono lo standard o chiedono ai loro amici.
  3. Rompe il principio di minima sorpresa in un brutto modo.
  4. Va contro il principio di "scrivere ciò che intendi", cioè avere il codice esprimere concetti di dominio problematico.
  5. Ordinamento di a numero magico (è discutibile se 0 costituisca effettivamente un numero magico in questo caso).

Continuerò? ... Sono sicuro al 99% di avere un superiore alternativo in quasi ogni aspetto. Sono addirittura al 66% convinto di aver fatto qualcos'altro che è "cattivo" per manipolare te stesso nel volerlo fare.

Ricordate sempre: Altre persone, che non ti consulteranno, prima o poi dovranno mantenere questo codice. Pensa a loro, non solo a te stesso, chi può capirlo. Inoltre, tra un decennio, chi dirà che ricorderai il tuo trucco? Potresti essere il mantenitore confuso ...


30
2017-10-12 19:00