9
votes

Des idées pourquoi qhash et qmap renvient const t au lieu de const t &?

Contrairement à STD :: Carte et STD :: Hash_Map, versions correspondantes dans QT Ne vous soucez pas de renvoyer une référence. N'est-il pas assez inefficace, si je construis un hash pour une classe assez volumineuse?

Modifier

surtout car il existe une valeur de méthode distincte (), qui pourrait alors le renvoyer par valeur.


2 commentaires

Dupliqué possible de Pourquoi QMAP :: opérateur [] (Const Clé & Key ) retour par valeur?


@Thomasklier Bien sûr, vient de poser 5 ans plus tôt


4 Réponses :


1
votes

bizarre, oui.

Peut-être ceci est dû à la sémantique souhaitée, où agissez par ex. Valeur () sur une clé non spécifiée , retourne une valeur construite par défaut du type approprié. Ce n'est pas possible en utilisant des références, du moins pas aussi proprement.

Aussi, des choses comme Optimisation de la valeur de retour Nom peut atténuer l'impact de la performance de cette conception.


0 commentaires

3
votes

En réalité, certaines des méthodes do renvoient une référence ... Par exemple, la version non constituée de opérateur [] renvoie un t & < / code>.

Cependant, la version constante de opérateur [] renvoie un const t . Pourquoi? Comme "se détendre" a déjà noté, la raison en laquelle on dirait avec ce qui se passe lorsque la clé n'existe pas sur la carte. Dans l'opérateur non-const [] , nous pouvons ajouter la clé à la carte, puis renvoyer une référence à l'entrée nouvellement ajoutée. Cependant, l'opérateur Const [] ne peut pas faire cela car il ne peut pas modifier la carte. Alors, que devrait-il renvoyer une référence? La solution consiste à rendre le const opérateur [] retour const t , puis renvoyer un t de valeur par défaut dans le cas où la clé est pas présent sur la carte.


2 commentaires

Je préférerais avoir un comportement de l'opérateur [] identique à celui de la méthode STD :: et Value () pour le renvoyer par la valeur ...


Ok, mais pourquoi ne pas const t qhash :: valeur (Const Key & Key, const T & DefaultValue) const renvoie une référence?



29
votes

Const-Indice des opérateurs de stl Les conteneurs peuvent renvoyer une référence à la Const car ils ne les refusent pas les appels avec des index qui n'existent pas dans le conteneur. Le comportement dans ce cas est indéfini. Par conséquent, comme un choix de conception sage, std :: map ne fournit même pas une surcharge de l'opérateur de constitution de const.

qmap essaie d'être un peu plus accommodant, fournit une surcharge de l'opérateur de constitution constitue en tant que sucre syntaxique, fonctionne dans le problème avec des touches non existantes, essaie à nouveau d'être plus accueillante et de renvoyer une valeur construite par défaut.

Si vous vouliez conserver la convention de référence de retour en constons de STL, vous devez attribuer une valeur statique et renvoyer une référence à que . Toutefois, cela serait tout à fait en attente avec les garanties de réentrancement que qmap fournit, la seule option consiste donc à renvoyer par la valeur. Le const Il n'ya qu'un revêtement de sucre pour empêcher certaines erreurs stupides comme constmap ["foo"] ++ de compilation.

Cela dit, le retour par référence n'est pas toujours le moyen le plus efficace. Si vous retournez un type fondamental ou, avec une optimisation plus agressive, lorsque Tailleof (t) <= Tailleof (vide *) , la valeur de retour indique souvent que le compilateur renvoie le résultat dans un registre directement Au lieu d'indirectement (adresse pour aboutir à un registre) ou-Heaven interdire - sur la pile.

L'autre raison (en plus de la pessimisation prématurée) pour préférer la référence pass-const-Référence, la tranchée, ne s'applique pas ici, car std :: mappez et qmap sont basés sur la valeur et donc homogènes. Pour un conteneur hétérogène, vous devez tenir des pointeurs et les pointeurs sont des types fondamentaux (sauf ceux intelligents, bien sûr).

Tout cela dit, je n'utilise presque jamais l'opérateur de const-chiffre de Constère dans Qt. Oui, il a une syntaxe plus belle que Recherche () + * IT , mais invariablement, vous finirez avec compteur () / Contient () Appels directement devant l'opérateur de const Semecript, ce qui signifie que vous faites la recherche binaire deux fois . Et alors vous remarquerez de toute façon les différences de la valeur de retour de la valeur de retour :)

pour valeur () Const , je conviens que cela devrait renvoyer la référence-to-const, défaut de la valeur de référence à la valeur par défaut en tant que deuxième argument, mais je suppose que je suppose que Les développeurs QT ont estimé que c'était trop magique.



4
votes

La documentation pour QMAP et QHASH disent spécifiquement à éviter opérateur [] pour rechercher en raison de la raison de la marque Martin B indiquée.

Si vous souhaitez une référence Const, utilisez const_iterator Const Key & Key) const où vous pouvez ensuite utiliser: xxx


0 commentaires