Qu'est-ce que "rvalue reference for * this"?
Suis tombé sur une proposition appelée "référence rvalue *" clang est C++11 page état.
J'ai lu un peu sur les références rvalue et compris, mais je ne pense pas que je sais à ce sujet. J'ai aussi ne pouvais pas trouver beaucoup de ressources sur le web en utilisant les termes.
Il y a un lien vers la proposition de papier sur la page: N2439 (Extension de la sémantique de déplacement*), mais je suis aussi ne pas avoir beaucoup d'exemples à partir de là.
Quelle est cette fonction?
source d'informationauteur ryaner
Vous devez vous connecter pour publier un commentaire.
Première, "ref-qualificatifs pour *ce" est un juste un "marketing de l'instruction". Le type de
*this
ne change jamais, voir en bas de ce post. C'est beaucoup plus facile à comprendre avec ce libellé.Ensuite, le code suivant permet de choisir la fonction à être appelés en fonction de la ref-qualificatif de la "implicite paramètre de l'objet" de la fonction†:
De sortie:
Le tout est fait pour vous permettre de profiter du fait que lorsque l'objet de l'appel de la fonction est une rvalue (sans nom temporaire, par exemple). Prenez le code suivant comme un autre exemple:
Cela peut être un peu tiré par les cheveux, mais vous devriez obtenir l'idée.
Notez que vous pouvez combiner le cv-qualificatifs (
const
etvolatile
) et ref-qualificatifs (&
et&&
).Remarque: Beaucoup de citations et de résolution de surcharge explication après ici!
† Pour comprendre comment cela fonctionne, et pourquoi @Nicol Bolas réponse est au moins en partie tort, nous devons creuser dans la norme C++ pour un peu (la partie expliquant pourquoi @Nicol la réponse est fausse est en bas, si vous n'êtes intéressé que par que).
La fonction qui va être appelée est déterminée par un processus appelé résolution de surcharge. Ce processus est assez complexe, nous allons donc nous toucher le peu qui est important pour nous.
Tout d'abord, il est important de voir comment la résolution de surcharge pour les fonctions de membre de travaux:
§13.3.1 [over.match.funcs]
Pourquoi avons-nous besoin de comparer membre et non-membre de fonctions? La surcharge d'opérateur, c'est pourquoi. Considérez ceci:
Vous seriez certainement voulez la suite de l'appel de la fonction libre, n'est-ce pas?
C'est pourquoi les membres et non-membres les fonctions sont incluses dans le soi-disant surcharge. Pour faire de la résolution de moins en moins compliqué, le gras de la partie de la norme citation existe. En outre, c'est l'important pour nous (même article):
(Le dernier bit signifie simplement que vous ne pouvez pas tricher surcharge de résolution basée sur la conversion implicite de l'objet à une fonction membre (ou l'exploitant) est appelée.)
Prenons le premier exemple en haut de ce post. À compter de la transformation, de la surcharge de jeu ressemble à quelque chose comme ceci:
Ensuite la liste des arguments, contenant un implicite de l'objet argumentest en correspondance avec le paramètre-liste de toutes les fonctions contenues dans la surcharge. Dans notre cas, l'argument de la liste ne contiendra que l'argument d'objet. Voyons comment cela ressemble:
Si, après tous les surcharges dans l'ensemble sont testés, un seul reste, la résolution de surcharge réussi et la fonction liée à celle transformé la surcharge est appelé. Il en va de même pour le deuxième appel à 'f':
Note cependant que, si nous n'avions pas prévu tout ref-qualificatif (et en tant que tel n'est pas surchargé la fonction), qui
f1
serait correspondre à une rvalue (encore§13.3.1
):Maintenant, sur pourquoi @Nicol réponse est au moins en partie tort. Il dit:
C'est faux,
*this
est toujours une lvalue:§5.3.1 [expr.unary.op] p1
§9.3.2 [class.this] p1
Il y a des cas d'utilisation pour la lvalue ref-qualificatif forme. C++98 a la langue qui permet à des non-
const
fonctions de membre d'être appelé pour des instances de classe qui sont rvalues. Cela conduit à toutes sortes de bizarreries qui est contraire à la notion même de rvalueness et dévie comment construit-dans les types de travaux:Lvalue ref-qualificatifs résoudre ces problèmes:
Maintenant, le travail des opérateurs comme ceux de la builtin types, acceptant seulement des lvalues.
Disons que vous avez deux fonctions de classe, avec le même nom et la même signature. Mais l'un d'eux est déclaré
const
:Si une instance de classe n'est pas
const
la surcharge de résolution, choisissez de préférence le non-const version. Si l'instance estconst
l'utilisateur peut seulement appeler lesconst
version. Et lethis
pointeur est uneconst
pointeur, de sorte que l'instance ne peut pas être changé.Ce que "r-valeur de référence pour ce` n'est de vous permettre d'ajouter une autre alternative:
Cela vous permet d'avoir une fonction qui peut seulement être appelée si l'utilisateur appelle par le biais d'un bon de r-valeur. Donc, si c'est dans le type
Object
:De cette façon, vous pouvez vous spécialiser le comportement selon que l'objet est accessible via une r-valeur ou pas.
Notez que vous n'êtes pas autorisé à la surcharge entre la r-valeur de référence et la version non-référence versions. C'est, si vous avez un nom de la fonction membre, toutes ses versions, soit utiliser le l/r-valeur qualificatifs sur
this
ou aucun d'entre eux n'. Vous ne pouvez pas faire ceci:Vous devez faire ceci:
Remarque que cette déclaration change le type de
*this
. Cela signifie que le&&
les versions de tous les accès des membres de la r-valeur de référence. Ainsi, il devient possible de déplacer facilement à l'intérieur de l'objet. L'exemple donné dans la première version de la proposition est (remarque: les informations suivantes ne peuvent pas être correct avec la dernière version de C++11; c'est directement à partir de l'initiale "r-valeur de cette" proposition):