La valeur du this
pointeur est-elle garantie constante pendant la durée de vie d'un objet particulier? Je ne peux pas imaginer un cas où cela changerait, mais je ne sais pas si je ne manque pas quelque chose.
la source
La valeur du this
pointeur est-elle garantie constante pendant la durée de vie d'un objet particulier? Je ne peux pas imaginer un cas où cela changerait, mais je ne sais pas si je ne manque pas quelque chose.
La valeur du
this
pointeur est-elle garantie constante pendant toute la durée de vie d'un objet particulier?
Oui .
Comme le dit l'utilisateur Aconcagua : la valeur du this
pointeur est toujours la valeur de l'adresse de l'objet sur lequel la fonction a été appelée 1 . La question est donc équivalente à:
Un objet peut-il changer son adresse mémoire au cours de sa durée de vie?
Ce n'est pas possible, par définition de lifetime
2 . La durée de vie d'un objet commence lorsque ou après son stockage est obtenu et se termine avant le moment où il est libéré.
Dans le corps d'une
[class.mfct]
fonction membre non statique ( ), le mot cléthis
est une valeur dont la valeur est un pointeur vers l'objet pour lequel la fonction est appelée.
2) [basic.life]/1
(c'est moi qui souligne)
La durée de vie d'un objet ou d'une référence est une propriété d'exécution de l'objet ou de la référence. Une variable est dite avoir une initialisation vide si elle est initialisée par défaut et, si elle est de type classe ou un tableau (éventuellement multidimensionnel) de celle-ci, ce type de classe a un constructeur par défaut trivial. La durée de vie d'un objet de type
T
commence lorsque :
- stockage avec l'alignement et la taille appropriés pour le type
T
est obtenu , et- son initialisation (le cas échéant) est terminée (y compris l'initialisation vide) (
[dcl.init]
), sauf que si l'objet est un membre d'union ou un sous-objet de celui-ci, sa durée de vie ne commence que si ce membre est le membre initialisé dans l'union ([dcl.init.aggr]
,[class.base.init]
), ou en tant que décrit dans[class.union]
.La durée de vie d'un objet
o
de typeT
se termine lorsque :
- si
T
s'agit d'un type non-classe, l'objet est détruit, ou- si
T
est un type de classe, l'appel du destructeur démarre, ou- l'espace de stockage occupé par l'objet est libéré ou est réutilisé par un objet qui n'est pas imbriqué dans
o
([intro.object]
).
this
chaque fois, quels que soient les mouvements du tas?
Un objet a une région de stockage. this
pointe là.
Un objet occupe une zone de stockage dans sa période de construction (
[class.cdtor]
), tout au long de sa vie et dans sa période de destruction ([class.cdtor]
).
La valeur de this
est garantie constante si le programme la lit jamais, si par la suite certains bits de la valeur lue sont impossibles à récupérer ou si par la suite certains bits de la valeur lue se sont échappés en dehors du programme. Dans tous les autres cas, il se comporte comme un chat de Schrödinger, c'est-à-dire qu'il est constant et variable à la fois.
this
this
pointeur est toujours la valeur de l'adresse de l'objet sur lequel la fonction a été appelée. La question est donc équivalente à «un objet peut-il changer son adresse mémoire au cours de sa durée de vie?std::move
changerait dethis
pointeur. Formellement, nous dirions que ce sont deux objets différents, mais de manière informelle, on peut les considérer comme «les mêmes», ce qui pourrait engendrer la confusion si l'on n'y prête pas attention.