const& , & und && Bezeichner für member-Funktionen in C++
Kürzlich wurde ich durch die Lektüre API von , boost::optional
und kam über die Linien:
T const& operator *() const& ;
T& operator *() & ;
T&& operator *() && ;
Schrieb ich auch mein eigenes Programm, das definiert die member-Funktionen als const&, & und && (Beachten Sie, dass ich spreche nicht über den Rückgabetyp, aber den Planern kurz vor dem Semikolon) und Sie scheint gut zu funktionieren.
Weiß ich, was es bedeutet die Deklaration einer Memberfunktion const, aber kann mir jemand erklären, was es bedeutet, es zu erklären const&, & und &&.
Wie ist das nicht ein Duplikat ist mehr als 6 Jahre nach Stack-Überlauf gestartet?
InformationsquelleAutor john_zac | 2015-01-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
const&
bedeutet, dass diese überladung wird verwendet, nur für const non-const und lvalue-Objekt.&
bedeutet, dass diese überladung verwendet werden, nur für nicht-const-Objekt.&&
bedeutet, dass diese überladung wird verwendet, nur für rvalue-Objekt.für weitere Informationen über diese Funktion der standard C++11 kann man Lesen Sie diese post, Was ist "rvalue Referenz für *diese"?
*this
Objekt, das "heimlich" weitergegeben als das erste argument der Methoden.const&
und&
bedeutet, Sie werden verwendet für eineconst
- und nicht -const
lvalue.&&
wird nur verwendet werden, für die ein rvalue, nicht unbedingt eine Referenz.Tatsächlich, die
const &
binden können, um so ziemlich alles, sogar ein rvalue. Ähnliche Regeln gelten für die Bindung eines beliebigen Parameters -const T&
ist etwas besonderes - es kann binden, was nichtvolatile
IIRCDu hast Recht, warum Sie es Taten, und Nein, ein compiler nicht vorstellen
std::move
s wie sieht es passt. Es könnte brechen die Klasse der Invarianten, RAII Semantik etc. Der einzige Ort in den standard, wo etwas ähnliches erlaubt, istreturn
, wo er als ein rvalue ist als erste ausprobiert.Ich glaube, ich verstehe. Es ist eine Art analoguous dem Fall, in dem müssen wir immer wieder ausdrücklich die Verwendung von 'std::move" move-member-Variablen innerhalb eines move-Konstruktor
InformationsquelleAutor ForEveR
Es ist die Funktion ref-Qualifizierer, es ist eines der features von C++11. Es ist möglich, um eine überlastung nicht-statische member-Funktionen basierend auf, ob die implizite
this
Objekt-parameter ist ein lvalue oder ein rvalue durch die Angabe einer Funktion ref-Qualifizierer (einige details).Angeben, einen ref-Qualifizierer für ein nicht-statische member-Funktion, können Sie sich entweder qualifizieren die Funktion mit
&
oder&&
.InformationsquelleAutor Alper