2016-10-21 6 views
0

J'ai créé une classe avec la méthode, qui renvoie la référence au membre (pas une bonne encapsulation). J'utilise auto pour funtion recalibréepourquoi l'auto ne détecte pas le type de référence de la fonction

class classA 
{ 
    public: 
    classA(classA & rhs) 
    { 
     cout<<"copy constr A"<<endl; 
    }; 
    classA() = default; 
}; 

class classB 
{ 
    private: 
    classA obA; 
    public: 
     classA& getRefA(){return obA;} 
}; 

int main() 
{ 
    classB obB; 

    auto ob = obB.getRefA(); 
} 

Le résultat est copie constr A

Je comprends que l'auto ne détecte pas la référence de la fonction. Auto détecte-t-il uniquement le type sans référence?

+2

Oui. C'est ainsi que fonctionne la déduction de type C++. Scott Meyes a beaucoup parlé de "type déduction" avec l'auto, donc vous pouvez google pour ceux qui veulent obtenir plus d'informations. Ou ramasser efficace moderne C++ par lui. il a tout un chapitre dédié à cela. – Hayt

+1

[CppCon 2014: Scott Meyers "Déduction de type et pourquoi vous vous souciez"] (https://www.youtube.com/watch?v=wQxj20X-tIU) – Borgleader

Répondre

4

auto juste par lui-même ne déduit pas les types de référence. Vous pouvez utiliser auto& si vous avez explicitement besoin d'une référence lvalue ou auto&& pour utiliser les règles de regroupement de références pour l'inférence de type.

Si vous avez besoin du type d'une expression, utilisez decltype. Gardez à l'esprit qu'il existe une différence entre decltype(x) et decltype((x)) - ce dernier conserve des références.

Plus de ressources sur ce sujet:

3

La réponse courte est parce que auto ne saisit pas toute référence. Il ne capturera pas non plus les qualificatifs cv.

Si vous avez besoin de ce comportement, vous devez utiliser decltype.