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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top