Gli operatori di pedici cost di STL
contenitori possono restituire un riferimento-a-const perché rifiutano le chiamate ad esso con indici che non esistono nel contenitore. Il comportamento in questo caso non è definito. Di conseguenza, come una scelta di design saggia, std::map
non fornisce nemmeno un sovraccarico dell'operatore di sottoscrizione const.
QMap tenta di essere un po 'più accomodante, fornisce un sovraccarico dell'operatore di pedice const come zucchero sintattico, si imbatte nel problema con le chiavi non esistenti, tenta nuovamente di essere più accomodante e restituisce invece un valore predefinito.
Se si desidera mantenere la convenzione return-by-const-reference di STL, è necessario allocare un valore statico e restituire un riferimento a a. Ciò, tuttavia, sarebbe abbastanza in disaccordo con le garanzie di rientranza fornite da QMap
, quindi l'unica opzione è quella di restituire per valore. Il const
c'è solo un rivestimento di zucchero per prevenire alcuni errori stupidi come constmap["foo"]++
dalla compilazione.
Detto questo, il ritorno tramite riferimento non è sempre il modo più efficiente. Se restituisci un tipo fondamentale o, con ottimizzazione più aggressiva, quando sizeof(T)<=sizeof(void*)
, return-by-value spesso fa in modo che il compilatore restituisca il risultato in un registro direttamente anziché indirettamente (indirizzo per generare il registro) o-heaven forbid-on pila.
L'altro motivo (oltre alla premessa pessimizzazione) per preferire il riferimento pass-by-cost, l'affettatura, non si applica qui, poiché entrambi std::map
e QMap
sono basati sul valore e quindi omogenei.Per un contenitore eterogeneo, devi tenere puntatori e i puntatori sono tipi fondamentali (eccetto quelli intelligenti, ovviamente).
Ciò detto, non utilizzo quasi mai l'operatore const subscript in Qt. Sì, ha una sintassi più gradevole di find()
+ *it
, ma invariabilmente finirai con le chiamate count()
/ proprio di fronte all'operatore const subscript, il che significa che stai facendo la ricerca binaria due volte. E poi non noterete le differenze in termini di prestazioni minuscole valore di ritorno comunque :)
Per value() const
, però, sono d'accordo che deve restituire riferimento a const, inadempiente al riferimento-to-default-value essere passato come secondo argomento, ma suppongo che gli sviluppatori di Qt sentissero che era troppo magico.
Eventuali duplicati di [Perché QMap :: operator [\] (const Key & chiave) di ritorno per valore \ ?] (https://stackoverflow.com/questions/18503700/why-does-qmapoperatorconst-key-key-return-by-value) –
@ThomasCerto sicuro, appena chiesto 5 anni prima – MadH