2010-11-18 26 views
1

"La conversion lvalue-à-valeur n'est pas effectuée sur l'opérande de l'opérateur unaire &."concernant la conversion lvalue-à-rvalue

Puis-je savoir ce que cela signifiait pour> Peut-on expliquer ..Il S'il vous plaît

Ex:

int a[]={1,5}; 
int* x=&a; 

Répondre

1

Dans une expression, un lvalue-conversion rvalue fait référence à regarder la valeur d'un objet et est utilisé lorsque vous avez besoin d'une valeur d'objet (par exemple a + b vous avez besoin des valeurs de a et b pour déterminer le résultat que vous n'avez pas besoin de savoir où - si n'importe où - les objets originaux proviennent) .

Dans la adresse de opérateur vous devez avoir l'objet lui-même (par exemple un lvalue), la valeur de l'objet est hors de propos si une conversion lvalue-rvalue serait inutile, il serait perdre l'identité (emplacement) de l'objet lui-même qui est ce qui est important pour prendre une adresse.

1
int a[] = {1, 5}; 
int* x = &a; 

C'est une erreur de type. L'opérateur & donne un pointeur sur son opérande. Quel est son opérande ici? Un tableau de 2 entiers. Un pointeur à un tableau de 2 entiers n'est pas de type int*, mais de type int(*)[2].

Notez comment la règle que vous avez citée s'applique ici: dans de nombreux contextes, le nom d'un tableau se décompose en un pointeur vers son premier élément. (Mais généralement, arrays and pointers are not the same!) C'est ce qui se passe quand vous dites int* x = a;. Mais cette désintégration se produit lorsque vous appliquez l'opérateur & à un tableau. (Si cette conversion a arriver, &a tenteraient de prendre l'adresse de l'adresse de a, ce qui est un non-sens.)

3

Eh bien, cela signifie que la lvalue à la conversion rvalue n'est pas fait :-). Une conversion lvalue à rvalue se produit lorsque vous avez besoin de la valeur d'un objet, plutôt que juste une référence à celui-ci. Prendre l'adresse d'un objet ne nécessite pas la valeur, donc il n'y a pas de conversion lvalue à rvalue.

Je ne suis pas sûr de savoir comment cela est pertinent pour votre code. La conversion qui n'est pas effectuée dans la deuxième ligne de votre code est la conversion de tableau en pointeur . La conversion de lvalue à rvalue ne se fait pas non plus, bien sûr, mais c'est plutôt intuitif et normal. La conversion tableau en pointeur se produit dans la plupart des utilisations d'un tableau dans une expression, cependant, et pourrait donc surprendre certaines personnes plus. (En réalité, la conversion du tableau en pointeur ne se produit que lorsque cela est nécessaire, mais il y a très, très peu d'opérations qui sont légales sur un tableau, donc c'est très souvent nécessaire.Dans le cas d'un opérateur unaire &, la conversion de pointeur de tableau en n'a pas lieu (et ne peut pas, puisque le résultat de la conversion de tableau en pointeur est une valeur, et unaire & nécessite une valeur l). Donc, vous prenez l'adresse de le tableau, qui a le type int () [2], c'est-à-dire le pointeur vers un tableau de deux int. Qui à son tour rend l'affectation illégale, puisque le type cible n'est pas int () [2], mais int *, et il n'y a pas de conversion implicite entre les deux.

+0

Une valeur de tableau serait une chose pathologique ... – curiousguy