Frage

Ich habe dort in einer Antwort gesehen:Ist die Rückgabe per Rvalue-Referenz effizienter?

Die Definition der Elementfunktion:

Beta_ab const& getAB() const& { return ab; }

Ich kenne die lebenslauf-Qualifikation (const) auf Mitgliedsfunktionen, aber nicht const&.

Was bedeutet das letzte const& gemein?

War es hilfreich?

Lösung

Der & ist ein ref-Qualifikation.Referenzqualifizierer sind neu in C ++ 11 und werden noch nicht in allen Compilern unterstützt, sodass Sie sie derzeit nicht so oft sehen.Es gibt an, dass diese Funktion nur für L-Werte (und nicht für R-Werte) aufgerufen werden kann:

#include <iostream>

class kitten
{
private:
    int mood = 0;

public:
    void pet() &
    {
        mood += 1;
    }
};

int main()
{
    kitten cat{};
    cat.pet(); // ok

    kitten{}.pet(); // not ok: cannot pet a temporary kitten
}

Kombiniert mit dem cv-Qualifier const, bedeutet dies, dass Sie diese Elementfunktion nur für Werte aufrufen können, und diese können const .

Andere Tipps

Wir wissen, dass in diesem Code...

Beta_ab const& getAB() const { return ab; }
                       ^^^^^

Das hervorgehobene const bedeutet, dass die Memberfunktion auf a aufgerufen werden kann const Objekt.Eine Mitgliedsfunktion kann immer auf einer Nicht-Elementfunktion aufgerufen werden.const Objekt unabhängig von der CV-Qualifikation der Funktion.

Also in diesem Code...

Beta_ab const& getAB() const & { return ab; }
                             ^

Wir sollten damit rechnen, dass das hervorgehobene & sagt auch etwas darüber aus, auf welche Arten von Objekten diese Mitgliedsfunktion aufgerufen werden darf.Wir hätten Recht;In C++11 besagt dies, dass die Memberfunktion nur für L-Werte aufgerufen werden darf.

Beta_ab const& getAB() const& { return ab; }
Beta_ab &&     getAB() &&     { return ab; }

Im obigen Beispiel wird die erste Überladung für L-Werte und die zweite Überladung für Nicht-Werte aufgerufen.const Werte.Ähnlich dem folgenden, bekannteren Beispiel, wobei Qualifizierer auf gewöhnliche Funktionsparameter angewendet werden:

void setAB(AB const& _ab) { ab = _ab; }
void setAB(AB &&     _ab) { ab = std::move(_ab); }

Bei gewöhnlichen Parametern funktioniert dies jedoch etwas anders, da in diesem Beispiel die erste Überladung einen R-Wert akzeptieren würde, wenn die zweite Überladung entfernt würde.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top