2017-08-14 4 views
1

Je peux prendre une adresse d'une valeur en la liant à une référence (qui elle-même, si je comprends bien, ne peut être référencée que par une lvalue).Y at-il une valeur que je peux directement prendre une adresse?

Y at-il un moyen d'obtenir rvalue que je peux prendre directement une adresse de (c'est-à-dire comme &(<rvalue>) serait une expression valide, sans déroger operator&())?

Ou peut-être est-ce au moins possible en 'liant' à une autre valeur? (Cela ne semble pas être le cas car nous ne pouvons que lier des références qui sont des lvalues, voir ci-dessus, mais peut-être qu'il me manque un concept similaire ici.)

La question plus générale que j'essaie de La réponse est de savoir si ce qui suit est vrai: rvalues ​​correspondent strictement à un ensemble d'expressions que l'on peut prendre directement une adresse, à l'exception des lfields bitfields et peut-être d'autres types de lvalues ​​'spéciaux'.

+0

A moins que votre valeur ne soit cachée dans une lvalue, vous ne pouvez pas prendre l'adresse de celle-ci comme '&' parce qu'elle contredit la définition de "référence lvalue" – AndyG

+0

language-lawyer est une variable? Fais-moi rire – arynaq

+0

Regardez ['std :: addressof()'] (http://fr.cppreference.com/w/cpp/memory/addressof), qui résout le problème des classes surchargeant 'operator &'. –

Répondre

3

[expr.prim.id.qual]:

A nested-nom-spécificateur qui désigne une classe, éventuellement suivie d' le mot-clé template ([temp.names]), puis suivi du nom de un membre soit de cette classe ([class.mem]) soit de l'une de ses classes de base , est un qualifié-id; [class.qual] décrit la recherche de noms pour les membres de la classe qui apparaissent dans les ID qualifiés. Le résultat est le membre. Le type du résultat est le type du membre. Le résultat est un lvalue si le membre est une fonction membre statique ou un membre de données et un prvalue sinon.

Autrement dit, la création d'un pointeur à membre à une fonction membre non statique est l'application de l'opérateur & à un prvalue.

+0

Est-ce le seul cas (que vous connaissez)? – ledonter

+0

@ledonter Il s'agit probablement du seul cas AFAICS, à moins que vous n'incluiez des rvalues ​​de classe avec des 'opérateurs &' surchargés. – Columbo

+0

Je ne suis pas convaincu. Vous ne prenez pas vraiment l'adresse, parce que '& (Foo :: bar)' serait mal formé. Je pense que la description opérationnelle plus correcte est que la forme spéciale '& Class '::' Membre | {Membre est un membre de données non statique de Class} 'est en cours de traduction, au lieu de' & expression | {expression est prvalue} ', dans ce cas. Notez que la question clarifie "(c'est-à-dire comme & () serait une expression valide, sans omettre l'opérateur &()" Cela étant dit, je comprends que c'est un truc, donc je ne suis pas en désaccord avec votre réponse:) –