Sappiamo che in questo codice ...
Beta_ab const& getAB() const { return ab; }
^^^^^
Il evidenziato const
significa che la funzione membro può essere chiamato un oggetto const
. Una funzione membro può sempre essere chiamata su un oggetto non-const
indipendentemente dalla qualifica cv della funzione.
Quindi, in questo codice ...
Beta_ab const& getAB() const & { return ab; }
^
Dovremmo aspettarci che l'evidenziata &
dice anche qualcosa su ciò che i tipi di oggetti di questa funzione membro è permesso di essere chiamato in causa. Saremmo corretti; 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 overload viene richiamato lvalue, e la seconda di sovraccarico viene richiamato non const
rvalues. Simile al seguente esempio più familiare, con qualificazioni 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 se, come in questo esempio, il primo overload avrebbe accettato un rvalue se il secondo overload sono stati rimossi .
Correlato/duplicato: http://stackoverflow.com/q/21861148/420683 – dyp