J'ai étudié auto
et je sais qu'il déduit des types à partir de valeurs initialisées. Si j'ai essayé d'écrire quelques lignes directrices pour l'utilisation de auto
, puis-je mettre ci-dessous des instructions en tant que règles?Règle de base pour utiliser auto && et const auto &
- Utilisation
auto &&
pour toutes les valeurs (valeurs de r et l-valeur, car il est un ref universel) qui sont modifiables, auto &&
même pour lire uniquement les valeurs,- utilisation
auto
lorsque cela est possible (individuel préférence pour le style de codage).
EDIT
class Test
{
public:
Test() = default;
Test(const Test&) = default;
Test(Test&&) = default;
int i = 1;
};
Test getObj()
{
return Test();
}
Test& getObjByRef()
{
static Test tobj;
return tobj;
}
const Test getObjConst()
{
return Test();
}
int main()
{
auto && obj1 = getObj();
obj1.i = 2;
std::cout << " getObj returns: " << getObj().i << std::endl;
auto&& obj2 = getObjByRef();
obj2.i = 3;
std::cout << " getObjByRef returns: " << getObjByRef().i << std::endl;
auto && obj3 = getObjConst();
//obj3.i = 4; => //Error C3490 'i' cannot be modified because it is being accessed through a const object
return 0;
}
Ainsi, dans l'exemple ci-dessus i utilisé auto &&
pour les trois fonctions
getObj
getObjByRef
getObjConst
et cela fonctionne comme prévu. Maintenant, je peux conclure que:
auto &&
peut être utilisé pour maintenir (initialiser) toute valeur, OU- Nous pouvons utiliser
auto &&
tous les endroits possibles.
Voyez-vous un piège de cette approche?
Ne pas utiliser auto &&. Utilisez un type simple ou une référence const. Sauf si vous implémentez déplacer ctor – user3104201
http://stackoverflow.com/a/13242177/2352671 – 101010
N.B. c'est ce qu'on appelle une référence de transfert maintenant, pas une référence universelle. –