9
votes

Pourquoi cela provoque C2102: "&" nécessite une valeur L

Je me demandais, pourquoi la voie de code suivante (déjà commentée) provoquera
C2102: '&' nécessite la valeur L CODE>

Y a-t-il un meilleur moyen d'éviter d'utiliser TMP code> variable? P>

class a {
private:
    int *dummy;
public:
    int* get_dummy() const {
        return dummy;
    }
};

int main()
{
    a aa;

    // error C2102: '&' requires l-value
    //int** me = &(aa.get_dummy());

    // OK!
    int *tmp = aa.get_dummy();
    int** me = &(tmp);
}

c++

2 commentaires

renvoyer une référence au pointeur.


Dupliqué possible de Erreur "L-Value requise"


5 Réponses :


4
votes

Non.

Quelle adresse me contient autrement? Ici, vous avez donné l'adresse de TMP - mais si vous le remplacez par int ** me = & aa.get_dummy (); , où serait-il pointant?

Il n'y a pas de réponse significative à cette question, la norme nécessite donc que l'argument de et soit un lvalue.


3 commentaires

Où cela voudrait-il cela? - N'est-il pas indiqué l'adresse de l'instance mannequin?


@YAN: Non. La fonction renvoie l'adresse (ou la valeur) stockée par mannequin , pas mannequin lui-même.


@YAN: Vous pouvez retourner dummy par référence, par exemple int * & get_dummy.



7
votes

Vous pouvez plutôt définir:

int **get_dummy() ... return &dummy;


3 commentaires

HMM, vous pourrez peut-être utiliser & aa , mais sinon, pourquoi voulez-vous le pointeur indirect? N'y a-t-il pas d'API pour changer le pointeur? Voulez-vous même le changer? Il est dangereux de prendre l'adresse d'une variable locale ...


Soyez global, membre ou variable local, tant que sa vie dépasse le référent, le «danger» du pointeur pendling est inexistant.


@Yeenfei, bien sûr, mais le retour d'une adresse d'une locale est une opération exotique dans n'importe quelle langue. Lorsque les gens ne comprennent pas complètement la réalité de temps d'exécution, rester sur le côté plus sûrement est probablement une bonne idée.



0
votes

L'opérateur & doit être appliqué à une lvalue. Lorsque l'appel aa.get_dumy () n'est attribué à une variable, sa valeur de retour est uniquement mise sur la pile, de sorte qu'il serait idiot (et erroné) d'obtenir l'adresse d'un élément de pile.


0 commentaires

9
votes

parce que A :: get_dummy () renvoie un objet temporaire SNONOMED (Int Pointer). de
Objet renvoyé par fonction SitoTop du cadre de pile et il n'a pas de sens pour obtenir son adresse car elle pourrait être invalide après extrémité d'expression.


10 commentaires

Même problème que la réponse de Luca. TMP est un objet de pile!


Dummy n'est pas un objet temporaire ni un objet local.


@Naveen: Oui, c'est vrai. Mais la réponse ne dit pas "Sans nom Temporaire" (qui vit jusqu'à la fin de son expression complète), il est indiqué "objet de pile" qui signifie généralement un objet dans un stockage "automatique" qui vit jusqu'à la fin de sa portée.


@Billy, ajouté le "Sans nom" sur ma réponse. Mais je ne vois pas "l'objet de la pile" dans ma réponse que vous parlez de.


@Yeenfei: L'objet de pile est impliqué par "Haut du cadre de pile" et "hors de portée". TMP est également invalide quand il est hors de portée. Les temporaires de compilation sans nom ont absolument rien à faire avec la portée. Ils vivent jusqu'à la fin de leur propre expression.


@Naveen: Nous ne retournons pas Dummy (comme cela nécessiterait une référence). Nous retournons une copie de Dummy (un pointeur) en tant que telle, ce n'est pas une variable et nous ne pouvons donc pas prendre son adresse. Donc oui c'est une temporaire (pensez-y en tant que pointeur temporaire).


@Billy, d'accord, j'ai toujours référé "Durée de vie de l'expression" en tant que portée, suppose que ce n'était pas le mot d'autres utilisations.


@Yeenfei: la portée a une signification très spécifique selon la norme. Voir la section 3.3 pour une définition exhaustive (qui est de 2 pages). Dans ce cas, cependant, nous ne sommes concernés que par une portée de bloc (section 3.3.3), qui est "simplement" une demi-page long.


@Billy, édité une utilisation de "portée" dans ma réponse à "expression". Le "haut de la pile" reste vrai sauf si elle est attribuée à une référence (et de nouveaux temporaires peuvent être placés sur le dessus au lieu de celui-ci).


"Asseyez-vous sur le cadre de la pile" - pas nécessairement, ils pourraient être stockés dans des registres parfois.