2009-01-02 4 views
1

Je reçois l'erreur lvalue invalide en utilisant gcc 3.4.6. La ligne qui appelle l'erreur a une fonction qui reçoit un pointeur sur SetElement (typedef void*). J'essaye de réaliser ceci en utilisant le moulage d'un autre type (également typedef void*) de la façon suivante: &((SetElement)my_var). gcc se plaint à ce sujet. Une idée de ce qui peut être fait?Lvalue invalide liée au moulage dans unary &

Répondre

3

Vous prenez l'adresse d'un temporaire (un rvalue), ce qui ne peut pas être fait. C'est comme essayer de le faire:

&(2+2) 
// or 
&4 
// or 
&(my_ptr + 4) 

Vous pouvez créer vous-même temporaire (donc un lvalue), en utilisant une des deux méthodes:

AnotherType **my_var_ptr = &my_var; 
SetElement **set_element_ptr = (SetElement *)my_var_ptr; 

// or 

SetElement *set_element = (SetElement)my_var; 
SetElement **set_element_ptr = &set_element; 

Ou vous pouvez simplement exprimés d'une manière différente (solution):

SetElement **set_element_ptr = (SetElement *)&my_var; 

Cela fonctionne parce que vous prenez l'adresse de my_var (un lvalue), et non de (un rvalue).

+0

Pourquoi est-ce une adresse temporaire? Et n'y a-t-il pas un moyen de le faire directement? –

+0

C'est temporaire parce que vous prenez une lvalue et la lancez, en la transformant en valeur. & attend une lvalue. Vous pouvez penser à lvalue et à rvalue comme parties gauche et droite d'une affectation. Voir mes exemples - & est toujours utilisé sur une lvalue. – strager

+0

En outre, je ne pense pas qu'il existe un moyen de le faire directement sans un temporaire. Si vous prenez l'adresse d'un temporaire, le temporaire sera détruit et votre pointeur sera invalide (pointant vers rien d'utile, indéfini). – strager

Questions connexes