2014-04-11 16 views

Antwort

18

Die & ist eine Ref-Qualifier. Ref-Qualifiers sind neu in C++ 11 und noch nicht in allen Compilern unterstützt, so dass Sie sie nicht so oft sehen. Es gibt an, dass diese Funktion nur auf lvalues ​​aufgerufen werden (und nicht auf rvalues):

#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 
} 

In Kombination mit dem cv-Qualifier const, es bedeutet, dass Sie nur diese Memberfunktion auf lvalues ​​aufrufen können, und diese können const sein.

+4

Sie können hinzufügen, dass dies eine neue Funktion in C++ 11 ist, noch nicht von allen Compilern unterstützt, und das ist nicht wahrscheinlich um es in vorhandenem Code (noch) zu sehen. –

+3

Die Relevanz dieser Konstruktion ist, dass es Dinge verbietet wie 'Beta_ab const & danger = Beta_ab(). GetAB();' –

+0

OK, ich verstehe. Wenn dies vom Compiler unterstützt wird, sollte dies bei jeder const-Memberfunktion gesetzt werden, die einen Const-Verweis auf eine Membervariable zurückgibt. Ich habe viele davon und hatte gelegentlich Fehler in Bezug auf die Verwendung auf einem Rvalue. – galinette

3

Wir wissen, dass in diesem Code ...

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

Die markierten const bedeutet, dass die Member-Funktion auf ein const Objekt aufgerufen werden kann. Eine Memberfunktion kann immer auf ein Objekt ungleich const unabhängig von der cv-Qualifikation der Funktion aufgerufen werden.

Also in diesem Code ...

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

Wir sollten erwarten, dass die markierten & sagt auch etwas darüber, welche Arten von Objekten dieser Elementfunktion erlaubt ist aufgerufen werden. Wir wären richtig; In C++ 11 heißt das, dass die Memberfunktion nur bei lvalues ​​aufgerufen werden kann.

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

In dem obigen Beispiel wird die erste Überlast an lvalues ​​aufgerufen, und die zweite Überlast wird auf nicht const rvalues ​​aufgerufen. Ähnlich wie bei dem folgende vertrauten Beispiel mit Qualifier gewöhnlichen Funktionsparametern angewandt:

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

Es wenn auch etwas anders für die normalen Parameter arbeitet, wie in diesem Beispiel, die erste Überlast würde eine rvalue akzeptieren, wenn die zweite Überlast entfernt wurden .