Je pense que lorsque le type est très connu parmi les coprogrammeurs qui travaillent (ou travailleraient) dans votre projet, alors auto
peut être utilisé, comme dans le code suivant :
//good : auto increases readability here
for(auto it = v.begin(); it != v.end(); ++it) //v is some [std] container
{
//..
}
Ou, plus généralement,
//good : auto increases readability here
for(auto it = std::begin(v); it != std::end(v); ++it)//v could be array as well
{
//..
}
Mais lorsque le type n'est pas très connu et peu utilisé, alors je pense que auto
semble réduire la lisibilité, comme ici :
//bad : auto decreases readability here
auto obj = ProcessData(someVariables);
Alors que dans le premier cas, l'utilisation de auto
semble très bon et ne réduit pas la lisibilité, et peut donc être utilisé de manière extensive, mais dans le dernier cas, il réduit la lisibilité et ne devrait donc pas être utilisé.
Un autre endroit où auto
peut être utilisé est lorsque vous utilisez new
1 o make_*
fonctions, comme ici :
//without auto. Not that good, looks cumbersome
SomeType<OtherType>::SomeOtherType * obj1 = new SomeType<OtherType>::SomeOtherType();
std::shared_ptr<XyzType> obj2 = std::make_shared<XyzType>(args...);
std::unique_ptr<XyzType> obj2 = std::make_unique<XyzType>(args...);
//With auto. good : auto increases readability here
auto obj1 = new SomeType<OtherType>::SomeOtherType();
auto obj2 = std::make_shared<XyzType>(args...);
auto obj3 = std::make_unique<XyzType>(args...);
Il s'agit ici d'une très bonne solution, car elle permet de réduire l'utilisation du clavier, sans pour autant réduire la lisibilité, puisque n'importe qui peut connaître le type d'information. objets en cours de création, juste en regardant le code.
1. Évitez d'utiliser <code>new</code> et les pointeurs bruts cependant.
Parfois, le type est si peu pertinent que la connaissance du type n'est même pas nécessaire, comme dans modèle d'expression ; en fait, pratiquement il est impossible d'écrire le type (correctement), dans de tels cas auto
est un soulagement pour les programmeurs. J'ai écrit une bibliothèque de modèles d'expression qui peut être utilisée comme :
foam::composition::expression<int> x;
auto s = x * x; //square
auto c = x * x * x; //cube
for(int i = 0; i < 5 ; i++ )
std::cout << s(i) << ", " << c(i) << std::endl;
Sortie :
0, 0
1, 1
4, 8
9, 27
16, 64
Maintenant, comparez le code ci-dessus avec le suivant équivalent qui n'utilise pas auto
:
foam::composition::expression<int> x;
//scroll horizontally to see the complete type!!
foam::composition::expression<foam::composition::details::binary_expression<foam::composition::expression<int>, foam::composition::expression<int>, foam::operators::multiply>> s = x * x; //square
foam::composition::expression<foam::composition::details::binary_expression<foam::composition::expression<foam::composition::details::binary_expression<foam::composition::expression<int>, foam::composition::expression<int>, foam::operators::multiply> >, foam::composition::expression<int>, foam::operators::multiply>> c = x * x * x; //cube
for(int i = 0; i < 5 ; i++ )
std::cout << s(i) << ", " << c(i) << std::endl;
Comme vous pouvez le voir, dans de tels cas auto
vous facilite la vie de manière exponentielle. Les expressions utilisées ci-dessus sont très simples ; réfléchissez au type de certaines expressions plus complexes :
auto a = x * x - 4 * x + 4;
auto b = x * (x + 10) / ( x * x+ 12 );
auto c = (x ^ 4 + x ^ 3 + x ^ 2 + x + 100 ) / ( x ^ 2 + 10 );
Le type de telles expressions serait encore plus énorme et laid, mais grâce à auto
nous pouvons maintenant laisser le compilateur déduire le type des expressions.
Donc l'essentiel est : le mot clé auto
pourrait augmenter ou diminuer la clarté et la lisibilité de votre code, en fonction du contexte . Si le contexte indique clairement ce que type ou du moins comment il devrait être utilisé (dans le cas d'un itérateur de conteneur standard) ou que la connaissance du type réel n'est même pas nécessaire (comme dans les modèles d'expression), alors auto
devrait être utilisé et si le contexte n'est pas clair et que ce n'est pas très courant (comme le deuxième cas ci-dessus), alors il vaut mieux que ce soit a évité .
10 votes
Le mot-clé auto réduit à coup sûr la lisibilité du code.
1 votes
@OncleBens Je ne pense pas que cela soit mauvais du tout. L'argument du type de modèle pour
static_cast
indique immédiatement quel typem
est, il est donc très lisible. IMO, l'abus est dans les cas où vous utilisezauto
pour déduire les types de valeurs de retour des fonctions définies par l'utilisateur.1 votes
@Praetorian Je ne suis pas d'accord,
auto
dans ces circonstances, réduit les conversions et les dépendances. S'il n'est pas important qu'une valeur ait une valeur particulier mais seulement qu'il a le bon type, alors utilisezauto
Libéralement !0 votes
On en a déjà parlé ici : stackoverflow.com/questions/6434971/
0 votes
auto
ne déclare pas les "types de variables".