Question

J'ai vu dans une réponse là-bas :Le retour par référence rvalue est-il plus efficace ?

La définition de la fonction membre :

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

Je connais le qualificatif de cv (const) sur les fonctions membres, mais pas const&.

Qu'est-ce que le dernier const& signifier?

Était-ce utile?

La solution

Le & est un qualificatif de référence.Les qualificatifs de référence sont nouveaux en C++11 et ne sont pas encore pris en charge par tous les compilateurs, vous ne les voyez donc pas très souvent actuellement.Il précise que cette fonction ne peut être appelée que sur les lvalues ​​(et non sur les 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
}

Combiné avec le qualificatif de CV const, cela signifie que vous ne pouvez appeler cette fonction membre que sur des lvalues, et celles-ci peuvent être const.

Autres conseils

Nous savons que dans ce code...

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

Le mis en évidence const signifie que la fonction membre peut être appelée un const objet.Une fonction membre peut toujours être appelée sur un non-const objet quelle que soit la qualification cv de la fonction.

Donc dans ce code...

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

Nous devrions nous attendre à ce que le mis en évidence & dit également quelque chose sur les types d'objets que cette fonction membre est autorisée à appeler.Nous aurions raison ;en C++11, cela indique que la fonction membre ne peut être appelée que sur des lvalues.

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

Dans l'exemple ci-dessus, la première surcharge est invoquée sur les lvalues ​​et la seconde surcharge est invoquée sur les non-valeurs.const valeurs.Semblable à l'exemple suivant plus familier, avec des qualificatifs appliqués aux paramètres de fonction ordinaires :

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

Cela fonctionne légèrement différemment pour les paramètres ordinaires, comme dans cet exemple, la première surcharge accepterait une valeur si la deuxième surcharge était supprimée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top