2013-08-29 13 views
8

ho notato che la QMap::operator[](const Key & key) ha questi due overloads:Perché QMap :: operator [] (const key & key) restituisce per valore?

T & QMap::operator[](const Key & key) 
const T QMap::operator[](const Key & key) const 

C'è una ragione per la restituzione per valore?

E dal momento che abbiamo la semantica move:

al ritorno per valore, dovremmo mai tornare per valore const?

Il motivo per cui chiedo è questo:

Immaginiamo di avere:

class ExpensiveToCopy; 
{ 
public: 
    int someProperty() const; 
    ... 
} 

void f(const QMap<int, ExpensiveToCopy>& map) 
{ 
    int lala = map[4].someProperty(); // We need to copy the entire object 
             // just to look at someProperty(); 
} 
+1

Solo un * sovraccarico di ritorno di un valore, l'altro restituisce un riferimento. –

+2

@Joachim Sì, questa è la cosa che non capisco. Non dovrebbero entrambi restituire un riferimento come ad esempio std :: vector :: operator []? –

+1

@nurettin it * does * inibisce la semantica del movimento. – juanchopanza

risposta

11

Nel caso in cui il const non possiamo aggiungere un elemento alla mappa const se non esiste già , quindi verrà restituito un oggetto locale.

In caso contrario, nel caso non-const, verrà creato un elemento con la chiave specificata (se non ce n'è uno già) prima di restituire un riferimento ad esso.

+3

Questo è esattamente. Stavo per scrivere la stessa risposta. Nota 'std :: map' non ha' const operator [] ', ed è probabilmente una buona cosa. Meno confusionario. – juanchopanza

+0

In particolare: il caso 'const' deve essere in grado di restituire un elemento costruito" predefinito "senza inserire nulla nella mappa nel caso in cui non venga trovato nella mappa un elemento con la chiave specificata. Quindi non può restituire un riferimento. – juanchopanza

+0

@juanchopanza Potrebbe restituire un riferimento a una variabile locale statica, quindi è possibile restituire un riferimento const. Se si vuole, è una questione diversa ... – Sjoerd

0

Penso che il riferimento non const assicuri che il codice client non possa modificare map in alcun modo. sai se usi const_cast<ExpensiveToCopy>map[4] o altri modi, possiamo ancora modificare map[4], ma questo map[4] non è un riferimento al 4 ° elemento di map.

Problemi correlati