Pourquoi ne pas avoir une adresse mémoire? Ne sont-ils pas chargés dans la RAM lorsque le programme exécute ou se réfère-t-il aux valeurs stockées dans des registres de processeur? P>
5 Réponses :
Que voulez-vous dire, les r devalouds ont une adresse. Jamais essayé
Vous pouvez capturer une référence de const à une rvalue, puis obtenir le pointeur du const, comme dans mon exemple de code.
@ K-ballo: Non. La référence du contre est liée à l'objet temporaire i> b>.
La catégorie de valeur est une propriété d'expression. Dans votre exemple, nous supposons que rvalue code> est en effet une rvalue mais
la valeur code> est vraiment un lvalue. La façon dont une variable (
valeur code> dans ce cas) a été initialisée n'affecte pas sa catégorie de valeur lorsqu'elle est utilisée dans une expression plus tard. Le fait que la variable
la valeur code> a été initialisée par une rvalue ne signifie rien pour la catégorie de valeur de la valeur code> lorsqu'il est utilisé dans l'expression
et la valeur code>. C'est toujours un lvalue.
@Nawaz ou un XValue.
penser à considère cela, p> ici, rvalue code> comme valeur em> d'une expression em>. La valeur em> elle-même n'a pas d'adresse. Mais les objets em> impliquent dans l'expression ont une adresse. Vous pouvez prendre l'adresse d'un objet em>, même s'il s'agit d'un objet temporaire.
10 < / Code> est une rvalue, de sorte qu'il apparaît em> que
& i code> est une adresse du
10 code>. Non, c'est faux.
& i code> est une adresse de l'objet temporaire em> de type
int code>, qui est créé hors de l'expression
10 code>. Et puisque l'objet temporaire ne peut pas être lié à une référence non-Const, j'utilise
const code>. Cela signifie que ce qui suit est une erreur: p>
Votre question ("Pourquoi ne pas avoir une adresse mémoire?") Est un peu confus. Une rvalue est une sorte d'expression. expressions em> ne pas avoir d'adresses: objets em> ont des adresses. Il serait plus correct de demander "pourquoi ne peut-on pas appliquer l'adresse de l'opérateur à une expression de rvalue?" P>
La réponse à celle-ci est plutôt simple: vous ne pouvez prendre que l'adresse d'un objet et toutes les expressions de rvalue se réfèrent à des objets (par exemple, l'expression Certaines expressions de rvalue font référence à des objets, mais de tels objets manquent de persistance. Un objet mentionné par une expression de rvalue est un objet temporaire em> et est détruit à la fin de l'expression dans laquelle elle est créée. Ces objets ont en effet des adresses (vous pouvez facilement découvrir cela en appelant une fonction de membre sur un objet temporaire; le pointeur C'est la différence fondamentale entre les expressions de Lvalue et les expressions de rvalue. Les expressions Lvalue font référence à des objets qui ont une persistance: l'objet à laquelle une expression de lvalue fait référence à persiste au-delà d'une expression unique . P> 42 code> a une valeur mais ne fait pas référence à un objet). p>
Ce pointeur code> doit pointer sur l'objet temporaire et donc l'objet temporaire doit avoir une adresse). < / p>
Prenez simplement ce cas
int* a = &3;
Lorsque vous avez besoin de l'adresse d'un objet, vous utilisez et. P>
Si des r devalues seraient adressables, cela signifie que vous pouvez déclarer un pointeur sur l'endroit où votre ordinateur a décidé de stocker 3 P>
int a = 1 + 2;
La question implique deux aspects différents liés à la "spécification" et à la "mise en œuvre". P>
La "spécification" définit certaines règles abstraites qui définissent la manière dont la langue se comporte de respect à une machine abstraite qu'elle fonctionne. Adaptez cette "machine abstraite" à la "vraie" sous celle-ci, c'est un but du compilateur (pas la langue). P>
Qu'est-ce que la spécification est la mise en application, c'est-ce que le point de support de langue - un "stockage" (un morceau de mémoire avec une adresse appropriée) n'est donné qu'aux objets qui ont un nom em> (pour le L'existence de la portée qui nomme vit) ou qui sont allouées de manière dynamique avec une demande explicite ( Bien sûr, cela doit rester (physiquement) quelque part, vous pouvez donc que vous puissiez-qu'on peut-être moulé ou conversion approprié, essayant de deviner une adresse mémoire. Mais la spécification linguistique n'accorde aucun comportement cohérent si vous essayez de l'utiliser activement.
Cela signifie que différents compilateurs peuvent se comporter différemment et optimiser mieux ils peuvent respecter la vraie machine qu'ils ciblent. P> nouveau code>).
Tout le reste est "temporaire": attribuer, copier et se déplace comme un objet, mais n'est pas nécessaire pour exister em> dans un endroit bien défini et stable. Au moins, pas dans le but de la langue. P>