2016-07-12 2 views
-1

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 &

  1. Utilisation auto && pour toutes les valeurs (valeurs de r et l-valeur, car il est un ref universel) qui sont modifiables,
  2. auto && même pour lire uniquement les valeurs,
  3. 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?

+0

Ne pas utiliser auto &&. Utilisez un type simple ou une référence const. Sauf si vous implémentez déplacer ctor – user3104201

+1

http://stackoverflow.com/a/13242177/2352671 – 101010

+0

N.B. c'est ce qu'on appelle une référence de transfert maintenant, pas une référence universelle. –

Répondre

-4

1) Oui 2) Oui 3) Comme vous l'avez dit, 'préférence individuelle pour le style de codage'

+1

Pourriez-vous expliquer vos réponses? Je pense que le questionneur cherche une argumentation pour ou contre ses lignes directrices suggérées. – jotrocken

+0

@jotrocken 1) 'auto &&' est une référence universelle, peut être liée à la fois l- et r- valeur. Je ne l'utiliserais pas toujours, mais c'est certainement possible. 2) 'const auto &' est en lecture seule, vous ne pouvez utiliser que des méthodes const sur un tel objet. 3) il appartient au développeur s'il veut utiliser auto et laisser le compilateur déduire le type ou écrire le type sur votre propre. OP demande si ces affirmations sont vraies. – paweldac

+0

@paweldac comme pour 1) vous avez dit, vous ne l'utiliseriez pas toujours, donc vous trouvez tout défaut qui l'empêche d'être utilisé * toujours * (sauf pour les éléments non-modifiables) => Il est rapide puis comparable à simple auto .. droite? –