Konstanter Referenzqualifizierer für eine Elementfunktion [duplizieren]
-
21-12-2019 - |
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?
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.