const& , & und && Spezifizierer für Mitgliedsfunktionen in C++

Lesezeit: 3 Minuten

const und Spezifizierer fur Mitgliedsfunktionen in C
john_zac

Kürzlich las ich durch die API von boost::optional und stieß auf die Zeilen:

T const& operator *() const& ;
T&       operator *() & ;
T&&      operator *() && ;

Ich habe auch mein eigenes Programm geschrieben, das Member-Funktionen als const&, & und && definiert (beachten Sie, dass ich nicht über den Rückgabetyp spreche, sondern über die Spezifizierer direkt vor den Semikolons), und sie scheinen gut zu funktionieren.

Ich weiß, was es bedeutet, eine Memberfunktion als const zu deklarieren, aber kann jemand erklären, was es bedeutet, sie als const&, & und && zu deklarieren.

const und Spezifizierer fur Mitgliedsfunktionen in C
Für immer

const& bedeutet, dass diese Überladung nur für konstante, nicht konstante und lvalue-Objekte verwendet wird.

const A a = A();
*a;

& bedeutet, dass diese Überladung nur für nicht konstante Objekte verwendet wird.

A a;
*a;

&& bedeutet, dass diese Überladung nur für das Rvalue-Objekt verwendet wird.

*A();

Weitere Informationen zu dieser Funktion des C++11-Standards finden Sie in diesem Beitrag Was ist „rvalue reference for *this“?

  • Wenn es hilft, stelle ich mir diese Qualifikationen gerne als Bewerbung für die vor *this Objekt, das “heimlich” als erstes Argument von Methoden übergeben wird.

    – Aaron McDaid

    21. Januar 2015 um 12:07 Uhr

  • const& und & bedeuten, dass sie für a verwendet werden const und nicht-const Wert. && wird nur für einen rvalue verwendet, nicht unbedingt für eine Referenz.

    – Angew ist nicht mehr stolz auf SO

    21. Januar 2015 um 12:12 Uhr

  • Eigentlich die const & kann an so ziemlich alles binden, sogar an einen rvalue. Ähnliche Regeln wie für die Bindung beliebiger Parameter gelten – const T& ist etwas Besonderes – es kann sich an alles binden, was es nicht ist volatile IIRC

    – Aaron McDaid

    21. Januar 2015 um 12:14 Uhr


  • @john_zac Sie haben Recht, warum sie es getan haben, und nein, ein Compiler kann nicht einführen std::moves wie es für richtig hält. Es könnte die Invarianten der Klasse, die RAII-Semantik usw. brechen. Die einzige Stelle im Standard, an der etwas Ähnliches erlaubt ist, ist returnwobei die Rückgabe als Rvalue zuerst versucht wird.

    – Angew ist nicht mehr stolz auf SO

    21. Januar 2015 um 12:20 Uhr

  • @john_zac, diese sind nicht ganz “notwendig”, wie Sie fragen. Sie bieten jedoch bestimmte optionale Optimierungen. Du könntest damit durchkommen, einfach zu haben T operator *(); – dies würde kompilieren, aber es hätte einige seltsame Konsequenzen – *p = x würde nicht das tun, was Sie erwarten. Ich denke, das Wichtigste ist der Rückgabetyp – wir wollen mehrere Überladungen mit unterschiedlichen Rückgabetypen. Sobald Sie die Erwünschtheit verschiedener Rückgabetypen verstanden haben, sehen Sie auch, dass wir die Qualifizierer am Ende benötigen, um zu steuern, welche Überladung (und daher welcher Rückgabetyp) für jeden Aufruf verwendet wird.

    – Aaron McDaid

    21. Januar 2015 um 12:28 Uhr

1646351408 602 const und Spezifizierer fur Mitgliedsfunktionen in C
Alper

Es handelt sich um Ref-Qualifizierer für Memberfunktionen, es ist eines der Features, die in C++11 hinzugefügt wurden. Es ist möglich, nicht statische Elementfunktionen zu überladen, je nachdem, ob die implizite this Objektparameter ist ein lvalue oder ein rvalue durch Angabe eines Funktionsref-Qualifizierers (ein paar Details).

Um einen Ref-Qualifizierer für eine nicht statische Elementfunktion anzugeben, können Sie die Funktion entweder mit qualifizieren & oder &&.

#include <iostream>
struct myStruct {
    void func() & { std::cout << "lvalue\n"; }
    void func() &&{ std::cout << "rvalue\n"; }
};

int main(){
    myStruct s;
    s.func();            // prints "lvalue"
    std::move(s).func(); // prints "rvalue"
    myStruct().func();   // prints "rvalue"
}

928740cookie-checkconst& , & und && Spezifizierer für Mitgliedsfunktionen in C++

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy