Qualificatore di riferimento const su una funzione membro [duplicato]
-
21-12-2019 - |
Domanda
Ho visto in una risposta lì:La restituzione per riferimento rvalue è più efficiente?
La definizione della funzione membro:
Beta_ab const& getAB() const& { return ab; }
Ho familiarità con il qualificatore cv (const
) sulle funzioni membro, ma non const&
.
Cosa significa l'ultimo const&
Significare?
Soluzione
IL &
è un qualificatore di riferimento.I qualificatori di riferimento sono nuovi in C++11 e non sono ancora supportati in tutti i compilatori, quindi al momento non li vedi così spesso.Specifica che questa funzione può essere chiamata solo su lvalue (e non su rvalue):
#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
}
Combinato con il qualificatore cv const
, significa che puoi chiamare questa funzione membro solo su lvalues e questi potrebbero essere const.
Altri suggerimenti
Sappiamo che in questo codice...
Beta_ab const& getAB() const { return ab; }
^^^^^
L'evidenziato const
significa che la funzione membro può essere chiamata a const
oggetto.Una funzione membro può sempre essere chiamata su un non-const
oggetto indipendentemente dalla qualifica cv della funzione.
Quindi in questo codice...
Beta_ab const& getAB() const & { return ab; }
^
Dovremmo aspettarci che l'evidenziato &
dice anche qualcosa su quali tipi di oggetti è consentito richiamare questa funzione membro.Avremmo ragione;in C++11, questo dice che la funzione membro può essere chiamata solo su lvalue.
Beta_ab const& getAB() const& { return ab; }
Beta_ab && getAB() && { return ab; }
Nell'esempio precedente, il primo sovraccarico viene richiamato su lvalues e il secondo sovraccarico viene richiamato su non-const
valori.Simile al seguente esempio più familiare, con qualificatori applicati ai parametri delle funzioni ordinarie:
void setAB(AB const& _ab) { ab = _ab; }
void setAB(AB && _ab) { ab = std::move(_ab); }
Funziona in modo leggermente diverso per i parametri ordinari, tuttavia, come in questo esempio, il primo sovraccarico accetterebbe un valore r se il secondo sovraccarico venisse rimosso.