Non sono sicuro di quale sia la tua preoccupazione (e forse dovresti chiarire la tua domanda se quella risposta non è sufficiente), ma m[10] += 1;
non viene tradotto in m[10] = m[10] + 1;
perché m
è un tipo di classe definito dall'utente e operatori sovraccaricati don ' t vengono tradotti dal compilatore, mai. Per a
e b
oggetti con un utente definito tipo di classe:
a+=b
non significa a = a + b
(a meno che non si rendono così)
a!=b
non significa !(a==b)
(a meno che non si rendono così)
Inoltre, le chiamate di funzione non vengono mai duplicate.
Quindi m[10] += 1;
significa chiamata una volta sovraccaricata operator[]
; return type è un riferimento, quindi l'espressione è un lvalue; quindi applicare l'operatore integrato +=
al valore l.
Non esiste un ordine di valutazione. Non ci sono nemmeno più ordini di valutazione possibili!
Inoltre, è necessario ricordare che il std::map<>::operator[]
non si comporta come std::vector<>::operator[]
(o std::deque
's), perché il map
è un'astrazione completamente diversa: vector
e deque
sono implementazioni del concetto di sequenza (dove le questioni di posizione), ma map
è un contenitore associativo (dove materie "chiave", non posizione):
std::vector<>::operator[]
richiede un indice numerico, e non ha senso se tale indice non si riferisce ad un elemento del vettore.
std::map<>::operator[]
prende una chiave (che può essere qualsiasi tipo che soddisfa i vincoli di base) e creerà una coppia (chiave, valore) se non esiste.
noti che per questo motivo, std::map<>::operator[]
è intrinsecamente un'operazione modifica e quindi non const, mentre std::vector<>::operator[]
non è intrinsecamente modificante ma può consentire la modifica tramite il riferimento restituito, ed è quindi "transitivamente" const: v[i]
sarà un lvalue modificabile se v
è un vettore non const e un valore const se v
è un vettore const.
Quindi nessuna preoccupazione, il codice ha un comportamento perfettamente ben definito.
Tali domande mostrano davvero che il linguaggio è diventato molto complicato – Slava
Come può essere ** UB **? – Destructor
@Destructor, si prega di vedere la modifica, qualcosa cambia? – DimG