2017-08-14 1 views
1

Ich kann eine Adresse eines rvalue nehmen, indem ich an eine Referenz binde (die, wie ich verstehe, nur durch einen lvalue bezeichnet werden kann).Gibt es einen rvalue, von dem ich direkt eine Adresse nehmen kann?

Gibt es eine Möglichkeit, Rvalue zu bekommen, dass ich direkt eine Adresse von (wie &(<rvalue>) wäre ein gültiger Ausdruck, ohne Überschreiben operator&()) nehmen könnte?

Oder vielleicht ist das mindestens möglich durch "Bindung" an einen anderen rvalue? (Dies scheint nicht der Fall zu sein, da wir nur an Referenzen binden können, die lvalues ​​sind, siehe oben. Aber vielleicht fehlt mir hier ein ähnliches Konzept.)

Die allgemeinere Frage, die ich versuche Die Antwort lautet, ob das Folgende zutrifft: RWerte entsprechen genau einer Menge von Ausdrücken, von denen man direkt eine Adresse nehmen kann, mit Ausnahme von lvalue-Bitfeldern und vielleicht einigen anderen solchen "speziellen" Arten von lvalues.

+0

Wenn Ihr rvalue nicht in einem Lvalue verborgen ist, können Sie die Adresse nicht als '&' verwenden, da dies der Definition von "lvalue reference" widerspricht. – AndyG

+0

Sprachanwalts ist ein Tag? Lass mich lachen – arynaq

+0

Betrachte ['std :: addressof()'] (http://en.cppreference.com/w/cpp/memory/addressof), was das Problem von Klassen betrifft, die 'operator &' außer Kraft setzen. –

Antwort

3

[expr.prim.id.qual]:

A nested-name-Spezifizierer, die eine Klasse bezeichnet, gegebenenfalls gefolgt von das Schlüsselwort template ([temp.names]) und dann mit dem Namen gefolgt Mitglied entweder dieser Klasse ([class.mem]) oder einer ihrer Basisklassen ist eine qualifizierte ID; [class.qual] beschreibt die Namenssuche für Klassenmitglieder, die in qualifizierten IDs angezeigt werden. Das Ergebnis ist das Mitglied. Der Typ des Ergebnisses ist der Typ des Elements. Das Ergebnis ist ein lvalue, wenn das Mitglied eine statische Elementfunktion oder ein Datenelement ist und andernfalls ein prvalue.

Das heißt, einen Zeiger-auf-Element auf eine nicht-statische Elementfunktion zu schaffen ist die Anwendung der & Betreiber zu einem prvalue.

+0

Ist das der einzige Fall (von dem Sie wissen)? – ledonter

+0

@ledonter Dies ist AFAICS nachweisbar der einzige Fall, es sei denn, Sie enthalten Klasse rvalues ​​mit überladenen 'Operator &' s. – Columbo

+0

Ich bin nicht überzeugt. Du nimmst nicht wirklich die Adresse davon, weil '& (Foo :: bar)' schlecht gebildet wäre. Ich denke, die korrekte operationelle Beschreibung ist, dass die spezielle Form '& Class '::' Member | {Member ist nicht statisches Datenelement der Klasse} 'wird übersetzt, anstatt' & Ausdruck | {Ausdruck ist Prvalue} ', in diesem Fall. Beachten Sie, dass die Frage klarstellt "(dh wie & () wäre ein gültiger Ausdruck, ohne den Operator &() zu überschreiben." Das heißt, ich verstehe, dass es ein Trickpost ist, also stimme ich überhaupt nicht mit Ihrer Antwort überein:) –

Verwandte Themen